regex - htaccess:从缺少值的查询字符串中删除 URL 参数?
问题描述
我想重定向:
https://www.example.com/?p2
至https://www.example.com/
https://www.example.com/?p1=v1&p2&p3=v3
至https://www.example.com/?p1=v1&p3=v3
https://www.example.com/page.php?p4=v4&p2
至https://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
正如@MrWhite指出的那样,尾随&
被截断了,因此考虑到这一点,您可以将上述内容用作单行条件来捕获所有可能性(注释行中提供的示例输入和输出//...
)。
在脚本中修复它
PHP
虽然您可以如上所示更改查询字符串,但当您可以在脚本中轻松处理它时(例如),这样做真的没有意义:
if(empty($_GET["p2"])){
unset($_GET["p2"]);
}
无论如何,您必须做什么来处理页面上的查询字符串?!
附加说明
上面的规则默默地删除了查询字符串。如果您希望用户知道,那么您应该按照@MrWhite 的[R=30X]
回答重定向,使用适当的 HTTP 响应代码设置标志:
推荐阅读
- python - 如何让我的随机数猜谜游戏在用户输入时再次循环以及如何创建错误陷阱?
- django - 404 Failed to load resource: 服务器响应状态为 404 (Not Found) Django React
- algorithm - 优化算法计算 (sin(x)-x)*x^{-3} (在matlab中)
- python - 使用numpy广播计算距离矩阵的方法
- ruby-on-rails - 如何使用 AWS 开发工具包从 S3 下载对象 - RESTful
- azure - 将重定向 URL 添加到不使用门户的 B2C 应用程序
- android - 右对齐 LinearLayout 并填充左 LinearLayout
- c# - MongoDB Compass 将 SSL 与 .pem 文件一起使用
- javascript - 如何在javascript中将二维嵌套数组转换为二维单数组
- python - 当使用 Conducto 进行 CI/CD 时,我是否必须创建自己的 dockerfile?