htaccess RewriteRule: проблема, чтобы опустить все после 1-го аргумента - PullRequest
0 голосов
/ 22 октября 2018

Цель: Хотите переписать все URL типа

https://www.example.com/page/1234/?/blog/foo/bar/

на

https://www.example.com/page/1234/

В .htaccess Я перепробовал множество вариантов по линии

RewriteEngine On
RewriteBase /
RewriteRule ^page/(\d+)/(.*)$  /page/$1 [R=301,L] 

Используя тестер .htaccess, я вижу, что, по крайней мере, соответствующий шаблон действителен.

Я бы ожидал, что после перезаписи ничего не будет включать после $1, но это произойдет, и покажет полный исходный URL.

Чего мне не хватает?

1 Ответ

0 голосов
/ 23 октября 2018
https://www.mypage.com/page/1234/?/blog/foo/bar/

Все после первого ? является частью запроса строка URL.По умолчанию Apache передает строку запроса без изменений из запроса на целевой URL-адрес (если только вы сами не создадите новую строку запроса на подстановке RewriteRule ).Это объясняет, почему вы видите ту же строку запроса на целевом URL-адресе, казалось бы, ничего не делая с ней.

Кстати, шаблон RewriteRule соответствует только только URL-пути -это особенно исключает строку запроса.Чтобы соответствовать строке запроса в mod_rewrite, вам нужно дополнительное условие , которое проверяет серверную переменную QUERY_STRING.

В Apache 2.4+ вы можете использовать флаг QSD (Query String Discard)удалить строку запроса из целевого URL.Или укажите пустую строку запроса в подстановке - включив в нее завершающий ? (сам ? не отображается в результирующем URL).

Например (в Apache2.4):

RewriteCond %{QUERY_STRING} .
RewriteRule ^page/(\d+)/  /page/$1/ [QSD,R=301,L]

Директива RewriteCond проверяет наличие строки запроса, которая необходима для предотвращения цикла перенаправления.

Конечный (.*)$ в RewriteRule pattern было излишним.

Вы опустили косую черту в конце замены (которая присутствует в примере URL).Это также предотвратило бы цикл перенаправления, но, как уже упоминалось, это не так, как в вашем примере.(В качестве альтернативы вы можете включить косую черту в захваченную обратную ссылку.)

Если вы все еще используете Apache 2.2, вам нужно будет включить конечный ? вместо флага QSD.Например:

RewriteRule ^page/(\d+)/  /page/$1/? [R=301,L]

Вам необходимо очистить кеш браузера перед тестированием, поскольку 301 (постоянные) перенаправления постоянно кэшируются браузером.По этой причине часто проще сначала выполнить 302 (временные) перенаправления.

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