RewriteRule для запросов файла изображения, только если присутствует строка запроса - PullRequest
2 голосов
/ 02 сентября 2011

С моими ограниченными возможностями регулярного выражения и mod_rewrite я пытаюсь переписать определенные запросы изображений, чтобы я мог изменить вывод с помощью php-скрипта.Вот что у меня есть:

RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+).(JPEG|JPG|GIF|PNG|jpeg|jpg|gif|png)$ public/images.php?%{QUERY_STRING}&src=$1/$2.$3 [L]
#            [       1      ] [       2       ] [                  3              ]

Это работает, но это слишком жадно и не требует строки запроса, что важно - в противном случае все запросы изображений будут переписаны.Я попытался вставить ? или ?(.*) в правило, и я либо получил бы внутреннюю ошибку сервера, либо это, похоже, не решило проблему (скорее всего потому, что я сделал это неправильно).Я также пытался %{QUERY_STRING} в конце условия, но это, похоже, ни на что не влияло.

Вот что я хочу сделать:

  • Любые запросы на public/ или uploads/ ...
  • За ним следует любой путь к изображению (без учета регистра расширения файла) ...
  • За ним следует строка запроса ...
  • ... следует переписать в public/images.php с исходной строкой запроса и добавить один дополнительный параметр: src, который содержит фактический путь к изображению (переписанная часть).
  • Extra-nice ", но не обязательно: ограничьте правило только переписыванием URL, если строка запроса содержит хотя бы один элемент из набора параметров.Например, только если присутствует один из параметров width=, height= или contrast=.Если это делает вещи раздутыми или усложненными, меня это не беспокоит.

Так, например, запрос на:

uploads/images/my_folder/test.jpg?width=320&height=220

Должен обслуживаться:

public/images.php?width=320&height=220&src=public/images/my_folder/test.jpg

Файл .htaccess находится в моем корневом каталоге, а также в каталогах public и uploads.

Я хочу избежать абсолютных URL-адресов, потому что я хочу, чтобы это было переносимымбез необходимости редактирования.Я много гуглял и читал соответствующие посты SO, и до сих пор не могу понять это.Как я могу исправить это правило, чтобы делать то, что я хочу, или есть лучший способ написать это вообще?

Редактировать : Просто хочу заметить, что это правило работало для меня ранее:

RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+).(JPEG|JPG|GIF|PNG|jpeg|jpg|gif|png)/([0-9]+)$ public/images.php?width=$4&src=$1/$2.$3

... но только для запросов типа uploads/my_folder/image.jpg/280 - я использовал 280 в качестве ширины, но теперь я хочу принимать комбинации нескольких параметров в произвольном порядке:

1 Ответ

2 голосов
/ 02 сентября 2011

Два подхода:

1. Добавить условие для перезаписи, только если строка запроса не пуста (может быть чем-либо):

RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ public/images.php?src=$1/$2.$3 [NC,QSA,L]

2. Добавить условия для перезаписи только в том случае, если строка запроса не пуста и присутствует хотя бы один из этих параметров (но значение может быть пустым):

RewriteCond %{QUERY_STRING} (^|&)width=([^&]*)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)height=([^&]*)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)contrast=([^&]*)(&|$)
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ public/images.php?src=$1/$2.$3 [NC,QSA,L]

Я не проверял на самом деле #2 .. но должно работать нормально (скопировано из полностью рабочего кода).


ПРИМЕЧАНИЯ:

Вы можете заменить ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ на ^((?:public|uploads)/(?:[A-Za-z0-9/_-]+)\.(?:jpe?g|gif|png))$ ..а затем вместо src=$1/$2.$3 используйте просто src=$1

В качестве альтернативы - замените ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ на ^(?:public|uploads)/[A-Za-z0-9/_-]+\.(?:jpe?g|gif|png)$, а затем используйте src=${REQUEST_URI} - единственное отличие в том, что параметр src= будет начинаться с начального слеша.

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