2014-09-19 36 views
6

有時市場部門會發送一封郵件,其中包含帶有多個問號的鏈接。mod_rewrite多個問號

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

這將導致應用程序服務器解釋mainpage?utm_campaign作爲參數,而不是僅僅mainpage。有沒有辦法在Apache中攔截這些錯誤的網址,並用&替換第二個?

+4

您是否能夠解僱營銷團隊? – Bobulous 2014-09-19 15:34:09

回答

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] 
+0

如果'site-page.jsp'不一致怎麼辦? – radimpe 2014-09-22 06:47:08

+0

你想重定向到一個現有的頁面嗎?你想做什麼呢? – 2014-09-22 08:33:48

+0

有點模糊,過了漫長的一週,只是星期一。目標網址將始終與原始網址相同,但我不想爲site-page1.jsp和site-page2.jsp編寫規則。因此,當需要清理「QUERY_STRING」時,請求的目標頁面將保持不變。希望現在有意義嗎?我想我想讓'$ PATH_INFO'保持不變。 – radimpe 2014-09-22 12:51:39

0

我遇到了在查詢字符串中可能出現多個附加問號的問題。起初,我開始爲多個用例編寫多條規則,但是發現要找到NE|No Escape標誌。

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

將做的伎倆。

這樣,問號將被遞歸移除。這會將請求數量增加到額外問號的數量,但將規則的數量減少到一個。

我也改變了正則表達式。這樣,查詢字符串開頭和結尾的其他問號也將被替換。不是一般情況,但如果我們只面臨常見情況,我們完全不需要這些規則;-)