我想根据查询字符串变量设置一个apache环境变量,但没有一些参数。
例如,我有这个查询字符串:
utm_source=foo&my_param=baz&utm_medium=bar&_t=9999
现在,我想设置一个没有utm_source
和utm_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]
答案 0 :(得分:1)
这个条件
RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC]
不会删除utm_source
和 utm_medium
,因为它只匹配一个。
.*
匹配最长的字符串,包括utm_source
或utm_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_source
和utm_medium
。
您可以使用&
括起测试字符串。这保证了在utm_source=...
部分之前和之后总是有&符号,并允许简化正则表达式。
RewriteCond &%{ENV:CustomQueryString}& ^(.*)&utm_source=.+?&(.*)$ [NC]
第二个RewriteCond
与utm_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`