此规则将强制任何index.html 301重定向到/:
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*index\.html[^\ ]*\ HTTP/
RewriteRule ^(([^/]+/)*)index\.html$ /$1? [R=301,L]
我正在寻求帮助,以确切了解这场比赛的作用(例如正则表达式帮助!)。
一些具体问题:
1)%{THE_REQUEST}
- 为什么需要这个?
2)HTTP / - 这是为了什么?
3)index\.html[^\ ]*\
- 这意味着在index.html之后不能是\或空格,对吧?
任何输入都将非常感谢帮助我理解这个正则表达式。
答案 0 :(得分:1)
%{THE_REQUEST}
变量是HTTP请求的第一行。它通常看起来像这样:
GET /some/dir/file.html HTTP/1.1
HEAD /images/some-image.png HTTP/1.0
POST /form/submit.php HTTP/1.1
这很重要,因为变量不会发生变化,而且实际上是客户端/浏览器所要求的变量,不像%{REQUEST_URI}
或%{QUERY_STRING}
这样的变量会改变重写引擎运行的每次迭代你的规则。因此,当重写引擎处理您的规则时,您肯定知道%{THE_REQUEST}
变量正是浏览器请求的变量,而不是请求或查询字符串的当前迭代是什么。
HTTP/
匹配请求的版本部分。实际上是一种较旧类型的HTTP请求,其中版本部分被完全删除("短" GET),但是对于大多数意图和目的,它表示请求的URI结束+任何查询字符串参数。例如:
GET /some/path/script.php?a=1&b=2 HTTP/1.1
HTTP/
表示URI路径的结尾+参数:/some/path/script.php?a=1&b=2
。
[^\ ]*
匹配除空格之外的任何内容。 \
是一个用于逃避空间的转义字符。否则,mod_rewrite将假定空格意味着正则表达式的结束和任何标志的开始;最终导致错误。
正则表达式index\.html[^\ ]*
特别匹配index.html
以及除空格之外可能出现的所有内容。所以:
index.html
index.html?some=param&and=more
index.html/some/path/
将全部匹配正则表达式。正则表达式的目的是你只想匹配index.html
之后的任何内容,它是请求的URI路径+ params的一部分,然后匹配URI之后的HTTP/
。你不在乎它是什么,如果那里有什么东西就跟它匹配。