【问题标题】:htaccess check length of a part of a query stringhtaccess 检查查询字符串的一部分的长度
【发布时间】:2012-12-04 09:59:37
【问题描述】:

如果请求的一部分短于 255 个字符(与缓存和 linux 中 255 个字符的文件名限制有关),我希望 apache 跳过某些重写。

我写了这个:

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 顺便说一句。

【问题讨论】:

  • 你的规则是正确的,问题出在别的地方。我在您的陈述中看到了一些混乱...请​​注意,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? 不是变量的一部分...不确定,如果它有什么不同也不能解决您的问题
  • 这确实是问题的关键,我应该使用:RewriteCond %{REQUEST_URI}_%{QUERY_STRING} ^(.*\/)([^\/\n]{0,255}) $(下划线代替问号)

标签: apache .htaccess mod-rewrite drupal-6


【解决方案1】:

? 之前的部分不在 %{QUERY_STRING} 中(在这种情况下与 PHP 中的 $_SERVER['QUERY_STRING'] 相反,因此会造成混淆),将 %{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 功劳?

【讨论】:

  • 如果你想同时测试 uri 和 query_string,那么你可以只使用 THE_REQUEST。
  • THE_REQUEST 包含完整的请求行,在这种情况下这将导致正则表达式出现其他问题。不知道这个变量,可能在其他情况下有用,所以还是感谢您的评论。
  • @Zeki using THE_REQUEST 是最后一个选项,如果不是绝对必要,则不应使用。此变量包含规范化之前的原始请求,任何处理和处理它都会直接产生其他问题 - 安全性、规则复杂性......
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多