2012-12-04 58 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'是最后一个选项,如果不是绝对必要的,不应该使用。这个变量在规范化之前包含原始请求,并且任何处理和处理它都会直接产生其他问题 - 安全性,规则的复杂性...... –