强制尾部斜杠。处理开销?

Force the trailing slash. Processing overhead?

我想在文件夹中强制使用尾部斜杠,而不是在文件中强制使用尾部斜杠。我想要一种方法来避免可能的重复。

我找到了答案: Htaccess: add/remove trailing slash from URL

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [L,R]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ // [L,R] # <- for test, for prod use [L,R=301]

我在我的 .htaccess 中尝试过,它似乎运行良好

但我在 Apache 文档中发现类似的代码可能会导致 "processing overhead"

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

我不知道我是否理解那个异议。这也适用于该代码吗?将它放在 .htaccess 中以在必要时强制使用正确的尾部斜杠是一种好习惯吗?如果不是,最好的方法是什么?

I tried in my .htaccess and it works very well

你确定吗? (也许它适用于您的特定情况??)但是您不应该将这两个规则块一起使用,它们的作用相反。第一个删除尾部斜杠(对于非目录),第二个规则附加尾部斜杠(对于非文件)。

例如,如果您请求 /foo/,其中 /foo 既不映射到目录也不映射到文件,那么您将得到一个重定向循环。尾部斜杠被删除,然后附加,等等

that forces trailing slashes in folders and not trailing slashes in files

嗯,实际上,这些规则都没有 "forces trailing slashes in folders"。如果您有 DirectorySlash On(默认值),那么 mod_dir 会在目录上强制使用尾部斜杠(使用 301 重定向)。

could cause "processing overhead"

处理开销 是在每次请求时检查目录 and/or 文件是否存在(匹配 RewriteRule 模式)。是的,这是一种间接费用——但是,随着间接费用的增加,它被认为是微不足道的。大多数 CMS 对其前端控制器使用类似的技术,例如:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

不过,这可以优化。您可以在文件开头为 "what looks like" 静态资源(图像、CSS、JS 等)包含一个例外,并阻止对这些请求的 directory/file 检查。例如:

RewriteRule .\.(jpe?g|png|gif|css|js)$ - [L]

这只是检查以这些文件扩展名结尾的任何请求并停止进一步处理,因此不会对这些请求执行 directory/file 检查。

RewriteRule ^(.*[^/])$ // [L,R] # <- for test, for prod use [L,R=301]

旁白:(以防万一这在您的实际代码中。)Apache 实际上不支持行尾注释。在这种情况下它将 "work",但未来的编辑可能会严重破坏,因此最好避免。请参阅我对另一个问题的回答:


I want to force trailing slashes in folders and not trailing slashes in files.

更新: 我假设我们只处理物理文件和目录,没有 虚拟 URL 被路由前端控制器等

在这种情况下,您不必执行任何操作来在目录上强制使用尾部斜杠(如上所述)。提供 DirectorySlash Off 而不是 设置那么你应该已经准备好了。这使得 mod_dir 在请求没有尾部斜线的目录时自动附加尾部斜线(通过 301 重定向)。 (您发布的第二条规则做同样的事情,但如果 mod_dir 正在做它的事情,那就多余了。)

要从文件中删除尾部斜杠,您只需要发布的两条规则中的第一条:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [R,L]

如果请求中存在尾部斜线并且它不是对物理目录的请求,这将删除尾部斜线。很难进一步优化它。仅当尾部斜杠开头时才处理该规则 - 因此被捕获的请求数量应该最少。但是,重要的是您已经在您的应用程序中链接到规范(非尾部斜杠)URL。

上面提到的排除静态资源的优化是可选的。如果您的 .htaccess 文件中没有其他 mod_rewrite 指令,那么它会提供 little/no 好处。