Назад | Перейти на главную страницу

правило mod_rewrite

Мне нужно правило 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 и переписывает его. Если это так, он просто передает его.

Надеюсь это поможет!