在.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]
“这也利用了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