【问题标题】:Remove IP address from Query String using HTACCESS使用 HTACCESS 从查询字符串中删除 IP 地址
【发布时间】:2011-03-28 17:52:15
【问题描述】:

我有一个这样的网址:

http://example.com/one/?ACT=123&gateway=mygateway&method=mymethod&orderID=303&currency=EUR&amount=11&PM=CreditCard&ACCEPTANCE=test123&STATUS=9&CARDNO=XXXXXXXXXXXX1111&ED=0517&CN=Test+test&TRXDATE=08%2F12%2F10&PAYID=7963938&NCERROR=0&BRAND=VISA&ECI=7&COMPLUS=q5up5h9i6clkkpsntdmupijpl5&IP=169%2E59%2E201%2E137&SHASIGN=1E02A96814AF21FD5415A285FB51A46DFCD6EF4D

我正在尝试从 URL IP=169%2E59%2E201%2E137 中的查询字符串中删除以下查询变量,同时保留字符串的其余部分。该变量是一个 IP 地址,每次可能是一个不同的 IP 地址,但始终是一个 IP。如果出于安全原因在查询字符串中找到 IP 地址,我使用的其中一个 CMS 系统将出错。不幸的是,我需要获取从支付网关发送的数据,并且网关无法关闭从它们发送的 IP 地址。如果我要捕获发送到我的 CMS 的数据,那么我需要使用 HTACCESS 删除或替换查询中的 IP。

    RewriteEngine On 
RewriteCond %{THE_REQUEST} ^GET\ /.*\ HTTP/ [NC]
RewriteCond %{QUERY_STRING} IP= [NC]
RewriteCond %{QUERY_STRING} (.*)(IP=[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3})(.*) [NC]
RewriteRule .* %{REQUEST_URI}?%1%3 [R=301,L]

所以,我开始写这样的东西,但老实说,我很讨厌 mod_rewrite 和正则表达式。

我不在乎它是否设置为 IP=123,或者只是被删除,但它不能被格式化为 IP。如果您能提供帮助,请告诉我!

【问题讨论】:

    标签: regex .htaccess mod-rewrite ip-address


    【解决方案1】:

    我不确定你的前两个 RewriteConds,但这样的东西应该可以工作......

    RewriteCond %{QUERY_STRING} (.*)IP=\d{1,3}%2E\d{1,3}%2E\d{1,3}%2E\d{1,3}&(.*) [NC]
    RewriteRule ^(.*)$ /$1?%1%2 [R=302,L]
    

    这确实假设在 IP 地址之后总会有一个参数,如果不是这种情况,您可以删除 & 但您最终会得到双 & 符号。如果总是有一个值在它之前,你总是可以将它移到 IP 之前。无论哪种方式,我都假设您使用的任何服务都是相当标准的。

    注意:我总是将 302 用于测试目的,因为一旦浏览器缓存了转发,就很难测试更改。一旦它工作,将其改回 301。

    【讨论】:

      【解决方案2】:

      编辑:这实际上是错误的,并且不起作用。我不打算更改它,因为Cags的回答已经解决了问题,所以请忽略它。

      您的问题是 %{REQUEST_URI} 包含 GET 值。因此,您最后所做的只是将除 IP 之外的所有内容再次添加到末尾,但 IP 仍然存在。此外,您不需要所有这些条件。您应该能够使用一条规则完成所有操作,如下所示:

      RewriteEngine on
      RewriteRule ^(.*)(IP=[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3})(.*)$ $1$3
      

      让我知道这是否适合你。

      【讨论】:

      • 我不知道为什么这有两个赞成票,反对票,因为 REQUEST_URI 不包括 QUERY_STRING。概念证明... RewriteRule ^(.*)$ google.co.uk/search?q=%{REQUEST_URI} [R=302]
      • 我也投了反对票,因为RewriteRule 的测试模式输入永远不会包含查询字符串部分,因此这使 OP 远离正确答案。此外,%{REQUEST_URI} 不包含 %{QUERY_STRING}mod_rewrite 只会自动将查询字符串附加到请求中,如果它没有被覆盖,无论在替换中是否指定了 %{REQUEST_URI}
      • 好的,我认为REQUEST_URI 包含查询字符串是因为自动附加的事情,并且因为 php 中的$_SERVER['REQUEST_URI'] 确实包含查询字符串。 @Tim 谢谢你的解释。我已经删除了我之前的评论并赞成 Cags 的回答。
      • 公平地说,我认为文档没有很好地解释 %{REQUEST_URI} 的行为与传递给 PHP 等进程的 REQUEST_URI 非常不同,这使得这个过程有点不清楚。这种混乱是绝对可以理解的(我只是在别人不知道这是否可行的情况下投票给你的情况下投了反对票)
      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 2023-04-10
      • 2016-10-05
      • 2017-06-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多