无法找出htaccess规则


9

我在htaccess中有此功能,但无法确定其用途。由于规则的性质,搜索也无济于事。

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

谁能解释一下它的用途吗?


如果请求部分(“ .com”之后的URL部分)不/以“ a” 结尾并且不包含“ .”,则通过在请求后面附加一个来重定向请求/。该规则的可能目的是处理自动目录索引。
peterh-恢复莫妮卡

Answers:


11

此规则的全部作用是/,如果.URI中没有尾部且URI中没有尾部,则将尾部添加到您的URL中,因此https://example.org/test将被重定向到https://example.org/test/,但https://example.org/test.html不会被重写为https://example.org/test.html/(但请注意:由于包含,https://example.org/test.case/folder不会被重定向到)https://example.org/test.case/folder/一个.在URI)。

## 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]

/test.case/folder也不会被重定向”-次要点,但是如果“文件夹”是文件系统目录,则mod_dir(默认情况下)将发出301重定向以附加尾随斜杠。仅当/test.case/some-other-virtual-url出现斜杠时才是问题。
怀特先生

6

未经验证,但使用我在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]

!(\/$|\.[^\/]*)-您更新的正则表达式确实没有什么不同。您还需要在第二部分(与扩展名匹配)上使用字符串结尾锚。也许是这样的:(!(/|\.[a-zA-Z]+)$无需转义斜线)。
MrWhite

@MrWhite好抓住!我更新了答案!
乔佛里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.