Мне нужно удалить один параметр из URL-адреса с помощью htaccess
из
http://example.com/page/detail/page.php?name=franco&age=50
к
http://example.com/page/detail/page.php?age=50
Я использую этот htaccess:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&?name=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2%3 [R=301,L]
Но у меня такой результат, я потерял путь к странице:
http://example.com/page.php?eta=57
файл находится в той же папке страницы.
Это проблема". В каталоге .htaccess
подает RewriteRule
шаблон (т.е. ^/?(.*)$
) соответствует URL-пути меньше префикса каталога, а не полный URL-путь. Другими словами, захваченный URL-путь просто page.php
не page/detail/page.php
как вы ожидаете.
Ваши директивы написаны так, как будто это .htaccess
файл находится в корне документов вашего сайта, а не в подкаталоге.
Поскольку ты не изменение URL-путь вы можете просто использовать REQUEST_URI
серверная переменная вместо замена строка, содержащая полный URL-путь (включая префикс косой черты):
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=302,L]
Поскольку вы сопоставляете каждый URL-путь и вам не нужно ничего захватывать, вы можете упростить RewriteRule
шаблон из ^/?(.*)$
к ^
. В %3
обратная ссылка в вашем примере излишняя (у вас есть только 2 захваченные группы в предыдущем CondPattern).
Обратите внимание, что это 302-е (временное) перенаправление. Измените это значение на 301 (постоянный), только если вы уверены, что все работает нормально, чтобы избежать проблем с кешированием браузера.
Перед тестированием вам необходимо очистить кеш браузера.
В RewriteCond
регулярное выражение также можно упростить:
RewriteCond %{QUERY_STRING} (.*)name=[^&]+&?(.*) [NC]
С первого &
было необязательным (т.е. &?
), предыдущий подшаблон (.*)
все равно потреблял бы это (что требуется). Итак, первая &?
можно просто удалить. Струнные якоря ^
и $
также не требуются (регулярное выражение жадный по умолчанию и будет использовать всю строку независимо).
В NC
флаг требуется только в том случае, если name
может быть смешанным регистром, в противном случае этот флаг должен быть удален.
имя параметра всегда является первым параметром
Если это так, то вам не нужен первый захваченный подшаблон и можно привязать name=
в начало строки запроса. Теперь есть только одна обратная ссылка (на строку после name=<value>
Параметр URL).
Итак, ваши директивы теперь становятся:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^name=[^&]+&?(.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1 [R=302,L]