首页 > 解决方案 > htaccess:从缺少值的查询字符串中删除 URL 参数?

问题描述

我想重定向:

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

但是p2查询字符串并不总是缺少该值,在这些情况下我不希望它被删除。

标签: regex.htaccessmod-rewritequery-string

解决方案


修复.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

正如@MrWhite指出的那样,尾随&被截断了,因此考虑到这一点,您可以将上述内容用作单行条件来捕获所有可能性(注释行中提供的示例输入和输出//...)。

在脚本中修复它

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

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

无论如何,您必须做什么来处理页面上的查询字符串?!


附加说明

上面的规则默默地删除了查询字符串。如果您希望用户知道,那么您应该按照@MrWhite 的[R=30X]回答重定向,使用适当的 HTTP 响应代码设置标志:

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


推荐阅读