Mod_Rewrite, поиск несуществующих файлов в другой папке - PullRequest
0 голосов
/ 21 октября 2011

У меня есть система шаблонов, в которой я использую изображения и другие виды файлов, так что вот пример нескольких шаблонов и их изображений

/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 Ответ

1 голос
/ 21 октября 2011

Я не уверен, почему вы получаете 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]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...