【问题标题】:Force the trailing slash. Processing overhead?强制使用斜杠。处理开销?
【发布时间】:2017-10-17 05:13:24
【问题描述】:

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

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

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

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

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

但我在 Apache 文档中发现类似的代码可能会导致“处理开销”

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

我不知道我是否理解这种反对意见。这也适用于该代码吗?将其放在 .htaccess 中以在必要时强制使用正确的斜杠是一种好习惯吗?如果不是最好的方法是什么?

【问题讨论】:

    标签: apache .htaccess mod-rewrite trailing-slash


    【解决方案1】:

    我在.htaccess 中尝试过,效果很好

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

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

    强制在文件夹中使用斜杠,而不是在文件中使用斜杠

    实际上,这些规则都没有“强制文件夹中的斜杠”。如果您有 DirectorySlash On(默认),那么 mod_dir 会强制目录上的尾部斜杠(使用 301 重定向)。

    可能会导致“处理开销”

    处理开销是检查每个请求是否存在目录和/或文件(匹配RewriteRule模式)。是的,这是一项开销 - 但是,随着开销的增加,它被认为是微不足道的。大多数 CMS 在其前端控制器中使用类似的技术,例如:

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

    但是,这可以进行优化。您可以在文件开头包含“看起来像”静态资源(图像、CSS、JS 等)的异常,并阻止对这些请求进行目录/文件检查。例如:

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

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

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

    旁白:(以防万一这是在您的实际代码中。)Apache 实际上并不支持行尾 cmets。在这种情况下它会“工作”,但未来的编辑可能会严重破坏,所以最好避免。请参阅我对其他问题的回答:https://stackoverflow.com/a/31770372/369434


    我想在文件夹中强制使用斜杠,而不是在文件中使用斜杠。

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

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

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

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

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

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

    【讨论】:

    • 很好解释的答案++
    • 感谢您的回答。我更新了我的问题。看来代码不是我需要的。你能建议最好的方法来强制文件夹的斜杠和文件的非斜杠。我正在寻找一种方法来避免可能的重复
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多