我的 htaccess 中有这个,但不知道它是干什么用的。由于规则的性质,搜索也无济于事。
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
谁能解释一下它的用途?
答案1
此规则所做的就是,如果没有,则在 URL 后面添加一个尾随字符,如果URI 中/
没有,则将重定向到,但不会被重写到(但请注意:还会.
https://example.org/test
https://example.org/test/
https://example.org/test.html
https://example.org/test.html/
https://example.org/test.case/folder
不是被重定向到,因为它在 URI 中https://example.org/test.case/folder/
包含一个)。.
## Do the following if the URI does not end with `/` or does not contain an `.`:
## the . is relevant for file names like test.html, which should n
RewriteCond %{REQUEST_URI} !(/$|\.)
## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]
答案2
未经验证,但根据我在 Apache 重写方面的经验,此配置似乎:
- 匹配 URI 的“路径”部分(而不是服务器、端口或查询参数),例如“/my/location/file.html”。
- 如果此部分不是以“/”(正斜杠)字符结尾,或者不包含“.”(点)字符,则匹配。
- 使用 URI 的完整路径部分并在其后附加正斜杠。
- 发送 HTTP 301(永久)重定向以将浏览器定向到此新 URI。
这将导致以下测试用例
/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource
因此,我认为该规则的目的是向似乎不是文件的资源添加斜线,但它似乎有一个极端情况。
如果不在路径非文件部分带有‘.’(点)字符的资源中添加斜线,则正则表达式应更改为:
# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]