Mod_Rewrite, поиск несуществующих файлов в другой папке

#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]
  

Постарайтесь, чтобы регулярные выражения были как можно более конкретными.