Моя проблема в том, что я хочу перенаправить ссылки, содержащие конкретная фраза и конкретная строка запроса после вопросительного знака.
Например - редирект с:
http://example.com/first-category?p=1
кому:
http://example.com/second-category
У меня есть код в .htaccess
, который перенаправляет все ссылки, содержащие p=1
после вопросительного знака:
RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]
Но как я уже сказал - ?p=1
существует в ссылках на множество страниц (категории, производители, информационные страницы блогов и т. д.), и этот код выше перенаправит все мои страницы с ?p=1
к /second-category
, что неверно.
Мне нужно определить другое условие (точки, содержащие first-category
фраза ПЕРЕД вопросительным знаком), но этот код работает некорректно:
RewriteCond %{REQUEST_URI} first-category
RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]
Есть идеи, как это исправить? Я не уверен, что здесь не так.
RewriteCond %{REQUEST_URI} first-category RewriteCond %{QUERY_STRING} p=1 [NC] RewriteRule .* http://example.com/second-category? [R=301,L]
Это должно «работать», так что, вероятно, у вас проблема с кешированием. Более раннее перенаправление 301 (постоянное), которое перенаправляло все, основанное только на строке запроса, было кэшировано браузером.
Однако вам не нужен другой состояние. Первый аргумент в пользу RewriteRule
директива (т. е. шаблон) уже соответствует URL-пути. В этом примере .*
Спички все, поэтому вам нужно сделать это более строгим.
Также обратите внимание, что эти аргументы являются регулярными выражениями, поэтому p=1
соответствует "p = 1" везде в строке запроса, а не только в начале, как в вашем примере. Точно так же first-category
соответствует "первой категории" везде в URL-пути, а не только в начале, как в вашем примере.
Вместо этого попробуйте следующее:
RewriteCond %{QUERY_STRING} ^p=1$
RewriteRule ^first-category$ http://example.com/second-category? [R=301,L]
Это соответствует именно запрос /first-category?p=1
(чувствительный к регистру). Обратите внимание, что префикс косой черты на RewriteRule
шаблон опущено в каталог контекст.
В NC
флаг в условии не требуется, если вам явно не нужно сопоставить P=1
также.
Если вы используете Apache 2.4+, вы можете использовать QSD
(Отмена строки запроса) вместо добавления одиночного ?
до конца замена строка, чтобы предотвратить неявное копирование строки запроса из запроса в замена.
Перед тестированием вам необходимо очистить кеш браузера. Рекомендуется протестировать с 302 (временными) перенаправлениями, чтобы избежать проблем с кешированием.