2012-12-04 57 views
3

我希望apache跳過某些重寫,以防部分請求短於255個字符(與緩存和Linux中的255字符文件名限制有關)。htaccess查詢查詢字符串的一部分的長度

我寫這樣的:

RewriteCond %{QUERY_STRING} "utm_campaign" 
RewriteCond %{QUERY_STRING} "utm_medium" 
RewriteCond %{QUERY_STRING} ^(.*\/)([^\/\n]{0,255})$ 
RewriteRule .* - [S=2] 

而且我測試與URL(q=path/to/page?utm_campaign=xxx&utm_medium=xxx)正則表達式,它匹配但QUERY_STRING變量似乎有不同的內容,因爲在此之後,2條規則仍然得到執行。在這種情況下,應該匹配的部分是page?utm_campaign=xxx&utm_medium=xxx(以及之後的所有內容)如果這少於255個字符,則可以跳過接下來的2個重寫規則。

我使用的是Drupal 6 btw。

+1

你的規則是正確的,問題在於別的。我在你的語句中看到一些混淆......請注意,'mod_rewrite'中可用的apache變量的內容如下:當訪問​​的URL是'http://www.example.com/path/file.ext?var= 1&var2 = 2' ...'%{REQUEST_URI}'是'/ path/file.ext','%{QUERY_STRING}'是'var = 1&var2 = 2' ...所以在你的例子中,'page?'是不是變量的一部分...不知道,如果它有任何區別,也不能解決您的問題 –

+0

這確實是問題的關鍵,我應該使用:RewriteCond%{REQUEST_URI} _%{QUERY_STRING} ^(。* \ /)([^ \/\ n] {0,255})$(下劃線代替問號) – MidnightMotion

回答

0

之前的部分?不在%{QUERY_STRING}(與$ _ SERVER [ 'QUERY_STRING']在PHP在這種情況下,因此混亂),添加%{REQUEST_URI}到的RewriteCond解決了這個問題:

RewriteCond %{QUERY_STRING} "utm_campaign" 
RewriteCond %{REQUEST_URI}%_{QUERY_STRING} "utm_medium" 
RewriteCond %{QUERY_STRING} ^(.*\/)([^\/\n]{0,255})$ 
RewriteRule .* - [S=2] 

不知道如何爲此解決方案提供@KamilŠrot積分,因爲答案在評論中?

+0

如果你想同時測試uri和query_string,那麼你可以使用THE_REQUEST。 – Zeki

+0

THE_REQUEST包含完整的請求行,這會在這種情況下導致正則表達式的其他問題。不知道這個變量,可能在其他情況下有用,所以感謝評論。 – MidnightMotion

+1

@Zeki使用'THE_REQUEST'是最後一個選項,如果不是絕對必要的,不應該使用。這個變量在規範化之前包含原始請求,並且任何處理和處理它都會直接產生其他問題 - 安全性,規則的複雜性...... –