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 (временные) перенаправления.