У меня такое правило:
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}
синтаксис задокументировано здесь.