使用HTACCESS从查询字符串中删除IP地址

时间:2010-08-12 04:29:07

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

我有一个像这样的网址:

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。如果你能提供帮助,请告诉我!

2 个答案:

答案 0 :(得分:2)

我不确定你的前两个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之前始终存在值,则可以始终将其移至IP之前。无论哪种方式,我都假设您使用的任何服务都是相当标准的。

NB:我总是使用302进行测试,因为一旦浏览器缓存转发,就很难测试更改。一旦工作,将其更改回301。

答案 1 :(得分:0)

编辑:这实际上是错误的,无法使用。我不会改变它,因为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

让我知道这是否适合你。