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

Apache RewriteRules не работают, но работают при тестировании с другими инструментами регулярных выражений?

У меня такое правило:

RewriteEngine On
RewriteRule   ^/page/([a-zA-Z0-9]+)\?(.*)$    /index.php?page=$1&$2

Должно получиться примерно так:

/page/contact?cake=lie

и переходим на страницу:

/index.php?page=contact&cake=lie

Я тестировал это с помощью таких инструментов, как RegExr и RegexPal, и там он работает. Но при помещении его в конфигурацию Apache посещение URL-адреса дает страницу 404 Apache.

Кто-нибудь может помочь?

По умолчанию mod_write совпадает с REQUEST_URI, который содержит только URI, но не динамические параметры, поэтому он отбрасывает все после вопросительного знака.

Чтобы сопоставить с полным URI, вам нужно вместо этого использовать THE_REQUEST (или, если есть другой метод, пожалуйста, просветите меня!). Обратите внимание, что он содержит полный запрос, отправленный клиентом, например «GET / foo? Bar = baz HTTP / 1.1».

Попробуйте что-нибудь вроде

RewriteCond %{THE_REQUEST} ^(.*)$
RewriteRule ^GET /page/([a-zA-Z0-9]+)\?(.*) HTTP.*$    /index.php?page=$1&$2

Если вы хотите передать существующую строку запроса дословно, mod_rewrite предоставляет QSA флаг для этого. Используя его, ваш набор правил можно упростить до следующего:

RewriteEngine On
RewriteRule   ^/page/([a-zA-Z0-9]+)$    /index.php?page=$1 [QSA]

mod_rewrite затем автоматически добавит любую существующую строку запроса к той, которую вы добавили с помощью своей замены. Результат такой же, как и Подход Стивена Моная, но я считаю этот метод немного чище.

У вас включен движок перезаписи?

RewriteEngine On

Оценка Янне того, почему ваше правило не работает, верна. Но для ее решения я бы выбрал менее сложный подход:

RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1&%{QUERY_STRING}

Нет необходимости разбирать необработанный запрос, чтобы получить строку запроса, если Apache уже дает ее вам в %{QUERY_STRING}.

Список переменных сервера, доступных вам через %{VARNAME} синтаксис задокументировано здесь.