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

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

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

Например - редирект с:

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 (временными) перенаправлениями, чтобы избежать проблем с кешированием.