无法弄清楚 htaccess 规则

无法弄清楚 htaccess 规则

我的 htaccess 中有这个,但不知道它是干什么用的。由于规则的性质,搜索也无济于事。

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

谁能解释一下它的用途?

答案1

此规则所做的就是,如果没有,则在 URL 后面添加一个尾随字符,如果URI 中/没有,则将重定向到,但不会被重写到(但请注意:还会.https://example.org/testhttps://example.org/test/https://example.org/test.htmlhttps://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 重写方面的经验,此配置似乎:

  1. 匹配 URI 的“路径”部分(而不是服务器、端口或查询参数),例如“/my/location/file.html”。
  2. 如果此部分不是以“/”(正斜杠)字符结尾,或者不包含“.”(点)字符,则匹配。
  3. 使用 URI 的完整路径部分并在其后附加正斜杠。
  4. 发送 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]

相关内容