Regex 删除URL中未列入白名单的任何参数

Regex 删除URL中未列入白名单的任何参数,regex,apache,.htaccess,url,mod-rewrite,Regex,Apache,.htaccess,Url,Mod Rewrite,我需要去掉不在白名单中的任何参数,例如URL: abc.com/somePage?phone=1234&stipAway=asd&fax=324&stripDown=disappear&zip=zip 我们应该看看: abc.com/somePage?phone=1234&fax=324&zip=zip abc.com/somePage2?fax=324&phone=1234&zip=zip abc.com/somePage3

我需要去掉不在白名单中的任何参数,例如URL:

abc.com/somePage?phone=1234&stipAway=asd&fax=324&stripDown=disappear&zip=zip
我们应该看看:

abc.com/somePage?phone=1234&fax=324&zip=zip
abc.com/somePage2?fax=324&phone=1234&zip=zip
abc.com/somePage3
相关问题:

另外,前两个答案中提到的解决方案更为复杂。为了便于理解,我将用更多的例子来说明:

abc.com/somePage2?stripAway=asd&fax=324&stripDown=disappear&phone=1234&zip=zip
我们应该看看:

abc.com/somePage?phone=1234&fax=324&zip=zip
abc.com/somePage2?fax=324&phone=1234&zip=zip
abc.com/somePage3

我们应该看看:

abc.com/somePage?phone=1234&fax=324&zip=zip
abc.com/somePage2?fax=324&phone=1234&zip=zip
abc.com/somePage3

以下内容适用于您:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(?:.*?&)?(phone=[^&]*)(?:.*?&)(fax=[^&]*)(?:.*?&)(zip=[^&]*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1%2%3 [L,R=302]

PS:这是假设白名单参数按上述顺序出现,即电话、传真、邮政编码

如果名单按顺序排列,anubhava的答案比我的好得多。如果不能保证列表是有序的,则可以使用以下规则。它使用的技术是

RewriteCond%{QUERY_STRING}^(.*)(?!(电话|传真| zip))[^=]+=
重写cond##%{QUERY_STRING}(.*)##(|.*)(phone)=([^&]+)
重写第二个%1&%3=%4##%{QUERY#u STRING}(.*)##(|..&)(传真)=([^&]+)
重写第二个%1&%3=%4##%{QUERY_STRING}(.*)##(|..&)(zip)=([^&]+)
重写规则^(.*)$$1?%3=%4%1[R,L]
那么,它有什么作用呢?第一个条件只有在能够找到与
(电话|传真|邮政编码)
(负向前看)不匹配的参数时才为真。接下来的三个
RewriteCond
捕获要保留的每个参数,并在自定义
##
分隔符之前准备一个查询字符串。如果该分隔符恰好位于查询字符串中,则会发生奇怪的事情

这种方法的缺点是,如果这三个参数中的一个不存在,则将不应用该规则。我个人会把这个白名单放在页面本身,而不是试图通过.htaccess过滤它


编辑:如果某些参数是可选的,则可以使用以下怪物:

RewriteCond %{QUERY_STRING} ^((.*?)&|)(?!(phone|fax|zip))[^=]+=[^&]+(&.*|)$
RewriteRule ^(.*)$ $1?%2%4 [R,E=Redir:1]

RewriteCond %{QUERY_STRING} ^&(.*)$
RewriteRule ^(.*)$ $1?%1 [R,E=Redir:1]

RewriteCond %{ENV:Redir} =1
RewriteRule ^ - [R,L]
基本上,如果字符串中的参数与前瞻中的参数不匹配,它将匹配该参数前面的部分和该参数后面的部分,并重新格式化查询字符串。第二条规则是,如果第一个参数不是“白名单”(或者它只是以&)开头,则防止它吞噬整个查询字符串,最后一条规则是尽量将重定向数量保持在最小。请注意,如果请求中有太多未列入白名单的参数,浏览器将显示错误(检测到重定向链)


相反,我建议对页面本身进行过滤。在php中,它类似于下面的代码。这将使维护此白名单变得更容易,并且如果您决定使用其他httpdeamon,也不会破坏一切

<?php
$whitelist = Array( 'phone', 'fax', 'zip' );
foreach( $_GET as $k => $v ) {
  if( !in_array( $k, $whitelist ) )
    unset( $_GET[$k] );
}

#And the same for $_POST and $_REQUEST

如果不是所有参数都存在,我已经用一种方法编辑了我的答案。马丁:对不起,我昨天不能参加这个问题。我相信也会有一些纯粹的方法。我今天就来试试。谢谢@Sumurai8的解释。我将使用在应用程序中处理它的方法。