Перенаправить ссылку со строкой запроса, но только с определенной страницы

Моя проблема в том, что я хочу перенаправить ссылки, содержащие конкретную фразу и конкретную строку запроса после вопросительного знака.

Например - перенаправление с:

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 на ] / вторая категория , что неверно.

Мне нужно определить другое условие (это точки, содержащие фразу первой категории ПЕРЕД вопросительным знаком), но этот код работает некорректно:

RewriteCond %{REQUEST_URI} first-category
RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]

Есть идеи, как это исправить? Я не уверен, что здесь неверно.

2
задан 12 December 2019 в 14:12
1 ответ
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 флаг (Query String Discard) вместо того, чтобы добавить одинокое ? в конец замена строка для предотвращения строки запроса от запроса, неявно скопированного в замена .

необходимо будет очистить кэш браузера перед тестированием. Рекомендуется протестировать с 302 (временными) перенаправлениями, чтобы не кэшировать проблемы.

1
ответ дан 31 December 2019 в 11:52

Теги

Похожие вопросы