#apache #mod-rewrite
#apache #mod-перезапись
Вопрос:
У меня есть система шаблонов, в которой я использую изображения и другие типы файлов, поэтому вот пример нескольких шаблонов и их изображений
/templates/template1/images/image1.jpg
/templates/template1/images/header/red/new/image1.jpg
/templates/template1/image2.jpg
/templates/template2/images/image2.jpg
/templates/template2/image2.jpg
Теперь, иногда шаблоны пропускают изображение или файл, в этих случаях я хочу перенаправить пользователя на шаблон «по умолчанию», сохраняя при этом остальную часть URL.
Итак, для приведенных примеров, если изображение не найдено, пользователь должен быть перенаправлен на
/templates/default/images/image1.jpg
/templates/default/images/header/red/new/image1.jpg
/templates/default/image2.jpg
/templates/default/images/image2.jpg
/templates/default/image2.jpg
Это моя попытка заставить это работать, это определено в файле виртуального хоста
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/templates/default/(.*)$
RewriteRule ^/templates/(.*)/(.*) /templates/default/$2 [R]
это прямо сейчас
перенаправляет /templates/template1/images/image1.jpg чтобы /templates/default/image1.jpg а затем выдает ошибку 500.
Что я здесь делаю не так?
Комментарии:
1. Какие-либо подробности в журнале ошибок Apache об этой ошибке 500?
2. Попробуйте добавить
$
^/templates/(.*)/(.*)
, чтобы сделать^/templates/(.*)/(.*)$
Ответ №1:
Я не уверен, почему вы получаете 500, но у ReqriteRule будут проблемы с несколькими подкаталогами из-за жадности первого .*
.
Рассмотрим запрос на /templates/template1/images/header/red/new/image1.jpg . Если этот файл не существует, то в ^/templates/(.*)/(.*)
, первый (.*)
будет соответствовать всем «template1 / images / header / red / new», а второй (. *) будет соответствовать «image1.jpg » и поэтому вы будете перенаправлены на » /templates/default/image1.jpg «.
Лучшее правило:
RewriteRule ^/templates/[^/] /(.*)$ /templates/default/$1 [R]
Или, если вы знаете, что каталоги шаблонов могут содержать только буквенно-цифровые символы, подчеркивание или дефис, это еще лучше:
RewriteRule ^/templates/[a-zA-Z0-9_-] /(.*)$ /templates/default/$1 [R]
Постарайтесь, чтобы регулярные выражения были как можно более конкретными.