mod_rewrite多个问号

时间:2014-09-19 15:17:31

标签: apache mod-rewrite

营销部门偶尔会发送一个邮件,其中包含带有多个问号的链接。

http://www.acme.com/site-page.jsp?content=mainpage?utm_campaign=somecampaign&utm_source=email

这会导致应用服务器将mainpage?utm_campaign解释为参数,而不仅仅是mainpage。有没有办法在Apache中拦截这些错误的URL并用?替换第二个&

2 个答案:

答案 0 :(得分:5)

您可以将此代码放入htaccess(必须位于根文件夹中)

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(.+?)\?(.+)$
RewriteRule ^site-page\.jsp$ /site-page.jsp?%1&%2 [R=302,L]

此代码将重定向

/site-page.jsp?content=mainpage?utm_campaign=somecampaign&utm_source=email

/site-page.jsp?content=mainpage&utm_campaign=somecampaign&utm_source=email

现在你有了这些参数:

  • content = mainpage
  • utm_campaign = somecampaign
  • utm_source = email

注意:随时将302(临时)重定向更改为301(永久)重定向


修改

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

答案 1 :(得分:0)

我遇到的问题是我的查询字符串中可能出现多个附加问号。起初我开始为多个用例编写多个规则,但却发现找到NE|No Escape标志。

RewriteCond %{QUERY_STRING} ^(.*)\?(.*)$
RewriteRule (.*) $1?%1&%2 [NE,R=302,L]

会做到这一点。

这样问号将被递归删除。这增加了对附加问号数量的请求数量,但将规则数量减少到一个。

我也改变了正则表达式。这样,在查询字符串的开头和结尾处的附加问号也将被替换。不是常见的情况,但如果我们只面对常见情况,我们根本不需要这些规则; - )