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

Htaccess - -удаление параметров из url

Мне нужно удалить один параметр из 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]