使用查询字符串重定向链接,但仅来自特定页面

使用查询字符串重定向链接,但仅来自特定页面

我的问题是我想重定向包含特定短语特定查询字符串问号后面。

例如-重定向自:

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]

有什么想法可以解决它吗?我不确定这里哪里出了问题。

答案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将匹配“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(临时)重定向进行测试以避免缓存问题。

相关内容