Мне нужно правило mod_rewrite, которое отправляет все запросы в index.php, если только запрос не относится к чему-либо в папке / media /.
У меня есть аналогичное правило для lighttpd, но я недостаточно знаю о regex / mod_rewrite, чтобы изменить его для Apache.
url.rewrite-once = (
"/(media)/(.*)" => "/$1/$2",
"^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3",
)
Спасибо
Внесение некоторых исправлений в ответ Редмумбы ...
RewriteEngine on
RewriteMap esc int:escape
RewriteCond $0 !^/media/
RewriteRule .* /index.php?url=$0\%3f${esc:%{QUERY_STRING}} [B]
Использовать $0
обратная ссылка, а не %{PATH_INFO}
для ссылки на входной путь. в RewriteRule
, добавить B
чтобы снова экранировать URL-адрес (как объяснено в mod_rewrite документы). Остальная часть правила заключается в двойном экранировании исходной строки запроса, чтобы ее можно было восстановить, когда url
параметр не экранирован вашим index.php
.
В качестве альтернативы, если ваш index.php
ожидает использовать строку запроса напрямую, а не декодировать ее из url
параметр, вы должны использовать
RewriteEngine on
RewriteCond $0 !^/media/
RewriteRule .* /index.php?url=$0 [B,QSA]
На самом деле это более точный перевод вашего правила перезаписи LighTTPD, но вы рискуете столкнуться с конфликтом, если строка входного запроса содержит url
сам параметр.
По сути, вы будете делать то же самое, только звонить RewriteRule
вместо того url.rewrite-once
. Кроме того, одно улучшение, которое можно было бы внести в оба, - это использовать RewriteCond
чтобы соответствовать медиа-части.
RewriteEngine on
RewriteCond %{PATH_INFO} !^/media/.*
RewriteRule ^([^\?]*)(\?(.+))?$ /index.php?url=$1&$3
Таким образом, вам не нужно переписывать правило для / media - это проверяет, не начинается ли оно с /media
и переписывает его. Если это так, он просто передает его.
Надеюсь это поможет!