基于查询字符串的htaccess环境变量,没有一些参数

时间:2016-06-26 08:32:35

标签: apache .htaccess environment-variables

我想根据查询字符串变量设置一个apache环境变量,但没有一些参数。

例如,我有这个查询字符串:

utm_source=foo&my_param=baz&utm_medium=bar&_t=9999

现在,我想设置一个没有utm_sourceutm_medium的变量:

my_param=baz&_t=9999

我只知道要删除的参数(utm_source& utm_medium)...其他只是一个例子......

我有这个代码:

RewriteEngine On
RewriteBase /

RewriteRule ^ - [E=CustomQueryString:%{QUERY_STRING}]

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%3]

输出

utm_source=foo&my_param=baz&_t=9999

为什么utm_source param仍然存在?

我也尝试过:

RewriteRule ^ - [E=CustomQueryString:%{QUERY_STRING}]

RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_source=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_medium=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

输出正确!

a=b&my_param=baz&_t=9999

我不承认为什么这个版本不起作用!

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%3]

2 个答案:

答案 0 :(得分:1)

这个条件

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC]

不会删除utm_source utm_medium,因为它只匹配一个

.*匹配最长的字符串,包括utm_sourceutm_medium中的一个,以先到者为准。另请参阅Repetition with Star and Plus,特别是Watch Out for The Greediness!部分及其后的详细说明。

utm_source|utm_medium表示简体中文:匹配utm_source utm_medium。所以正则表达式匹配

(.*)                          - %1, including utm_source
(utm_source|utm_medium)=[^&]+ - utm_medium=...
(.*)                          - %3, everything else after utm_medium

具有两个条件和规则的第二个变体有效,因为首先删除utm_source=...,然后将剩余的字符串传递给第二个条件。在utm_medium=...部分被移除,最后您拥有所需的字符串,同时没有utm_sourceutm_medium

您可以使用&括起测试字符串。这保证了在utm_source=...部分之前和之后总是有&符号,并允许简化正则表达式。

RewriteCond &%{ENV:CustomQueryString}& ^(.*)&utm_source=.+?&(.*)$ [NC]

第二个RewriteCondutm_medium相同。

答案 1 :(得分:1)

您可以使用这两个规则删除两个查询参数:

RewriteRule ^ - [E=CustomQueryString:%{QUERY_STRING}]

# remove utm_source from query string and set env var
RewriteCond %{ENV:CustomQueryString} ^(.*&)?utm_source=[^&]*(?:&(.*))?$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

# remove utm_medium from query string and reset env var
RewriteCond %{ENV:CustomQueryString} ^(.*&)?utm_medium=[^&]*(?:&(.*))?$ [NC]
RewriteRule ^ - [E=CustomQueryString:%1%2]

如果我们将网址作为/?utm_source=foo&my_param=baz&utm_medium=bar&_t=9999

开头

在第二条规则之后,我们将:

$_SERVER["CustomQueryString"] becomes `my_param=baz&_t=9999`