htaccess:是否从缺少值的查询字符串中删除URL参数



我想重定向:

  • https://www.example.com/?p2https://www.example.com/

  • https://www.example.com/?p1=v1&p2&p3=v3https://www.example.com/?p1=v1&p3=v3

  • https://www.example.com/page.php?p4=v4&p2https://www.example.com/page.php?p4=v4

您可以假设缺少值的查询字符串总是p2,如果这样可以更容易地回答问题的话。

但是p2查询字符串不会总是缺少该值,在这种情况下我不希望将其删除。

修复.htaccess

你可以在.htaccess中用一堆不同的方式重写。。。

示例1:

RewriteCond %{QUERY_STRING} ^p2$
RewriteRule . / [QSD,L]
RewriteCond %{QUERY_STRING} ^(.+)&p2$
RewriteRule . /?%1 [L]
RewriteCond %{QUERY_STRING} ^p2&(.+)$
RewriteRule . /?%1 [L]
RewriteCond %{QUERY_STRING} ^(.+)&p2(&.+)$
RewriteRule . /?%1%2 [L]

示例2:

RewriteCond %{QUERY_STRING} (^|.*&)p2(&.*|$)
RewriteRule . /?%1%2 [L]
// This doesn't give particularly clean query strings (not that they need to
// be for the server to understand it).
// e.g. 
//    ?p1=v1&p2&p3=v3 -> ?p1=v1&&p3=v3

示例3:

RewriteCond %{QUERY_STRING} (^|.*&)p2(?:&(.*)|$)
RewriteRule . /test.php?%1%2 [L]
// ?p2&p3=v3       -> ?p3=v3
// ?p1=v1&p2       -> ?p1=v1
// ?p1=v1&p2&p3=v3 -> ?p1=v1&p3=v3

"这也利用了mod_rewrite";"特征";,其中拖尾&在将结果查询字符串分配给Location HTTP响应标头之前,它会被自动截断/删除">@MrWhite

As@MrWhite指出尾部的&被截断,因此考虑到这一点后,您可以将以上内容作为一行条件来捕捉所有可能性(注释行//...中提供的示例输入和输出(。

在脚本中修复

虽然您可以如上所示更改查询字符串,但当您可以在脚本中轻松处理它时,这样做真的没有意义(例如PHP(:

if(empty($_GET["p2"])){
unset($_GET["p2"]);
}

要处理页面上的查询字符串,您必须执行哪些操作?!


附加说明

上面的规则以静默方式删除查询字符串。如果你想让用户知道,那么你应该按照@MrWhite的回答重定向,设置带有适当HTTP响应代码的标志[R=30X]

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

.htaccess中执行此操作的另一种方法。。。

RewriteCond %{QUERY_STRING} ^&?p2(?:&|$)(.*) [OR]
RewriteCond %{QUERY_STRING} (.+)&p2(&.*|$)
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=302,L]

在其他重写之前,它应该位于.htaccess文件的顶部附近。

这处理CCD_ 17 URL参数(没有值(的所有查询字符串变化;"干净";查询字符串。URL是";校正的";具有外部重定向。(首先用302-临时-重定向进行测试,然后改为301-永久-如果是这样的话,以避免潜在的缓存问题。(

两个OR条件中只有一个匹配。第一个条件处理p2出现在查询字符串开头时的情况。第二个条件处理p2稍后出现或出现在查询字符串末尾时的情况。这样我们就不会在生成的替换中得到不匹配或双&(URL参数分隔符(。

%1%2反向引用包含最后匹配的CondPattern中的第一个和第二个捕获组(以哪个为准(。基本上是p2参数前后的字符串。

这也利用了mod_rewrite";"特征";,在被分配给CCD_ 25 HTTP响应报头之前,结果查询字符串上的尾随CCD_。

然而,正如已经提到的,取决于这种";错误的";CCD_ 26 URL是并且它出现在哪里;忽略";并确保在HTML中设置了适当的rel="canonical"元素。

最新更新