Перезапись URL с выбранными параметрами строки запроса в .htaccess - PullRequest
8 голосов
/ 21 января 2010

Я недавно изменил свою CMS и хочу переписать некоторые из моих URL, чтобы они соответствовали новому формату параметра URL / строки запроса.

Старый URL был:

http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz

Новый URL должен быть:

http://www.mysite.com/?s=foo

Другими словами, в старом формате было несколько параметров строки запроса, но я только перезаписываю tag param в s , сохраняя то же значение. Другие параметры должны быть отброшены. Конечно, порядок параметров не должен иметь значения. Также не должно иметь значения, является ли тег единственным параметром или нет.

Есть идеи?

Ответы [ 3 ]

10 голосов
/ 21 января 2010

Вы можете попробовать использовать регулярные выражения и группировки, если ваш сервер поддерживает это. Если я не ошибаюсь, вам нужно переписать только один параметр, я думаю, вы можете попробовать что-то вроде (если вы используете apache с mod_rewrite):

RewriteCond %{QUERY_STRING} ^.*(\btag\b=(\w+|&\w+;)+)
RewriteRule ^(.+) /$1?%1 [L]

Редактировать: Я немного улучшил регулярное выражение, чтобы он соответствовал тегу независимо от его положения в строке запроса и сохранял последовательности специальных символов, такие как * 1006. Кроме того, следует избегать совпадений с аналогичные параметры (то есть: он не будет соответствовать параметру с именем "alttag").

Редактирование # 2: Альтернативой (особенно если вам необходимо отфильтровать несколько параметров) является использование внешней программы для перезаписи. Эта страница: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap (в частности, раздел «Программа внешнего переписывания») содержит полезную информацию.

2 голосов
/ 18 октября 2012

На веб-сервере Apache размещение следующего правила в .htaccess в корневом каталоге документа перезапишет URL-адреса, как вы описали:

RewriteCond %{QUERY_STRING} .*\btag=([^&]*).*
RewriteRule ^search\.cgi /?s=%1 [R=302]

В вышеприведенном правиле используется перенаправление 302, поэтому ваш браузер не запоминает правило перенаправления во время тестирования и настройки правила. Как только вы закончите тестирование, измените [R] на [R = 301]. 301 - это постоянное перенаправление, и оно лучше для SEO.

1 голос
/ 27 июня 2015

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

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*)
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302]

Это говорит:
(?: ) не фиксируйте это как% число
^|& в начале строки запроса или после амперсанда (это действует как граница слова, но особенно для URL).
tag= параметр, который мы ищем.
( ) захватите это, в% 1.
[^&]* ноль или более символов, не амперсанд (и остановка на амперсанде или работа до конца).

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