【问题标题】:Explanation of htaccess redirectionshtaccess 重定向的解释
【发布时间】:2017-10-26 00:14:51
【问题描述】:

我的 htaccess 中有一段正在运行的代码。(该代码在不包含它的 URL 请求上添加了一个 .html。)

但我想确切地了解它是如何工作的。我明白了大部分,但我不确定。

第一行:它包含所有没有 .html 的内容

第二行:??

第三行:排除目录?

第四行:它在每个不排除的地方添加 .html。

有人可以解释一下每一行吗?

RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.html [L,R=301]

谢谢

【问题讨论】:

    标签: html .htaccess


    【解决方案1】:

    你几乎得到了一切!干得好。

    RewriteCond %{REQUEST_URI} !^.*\.html$
    

    第一行只是一个获取 URI 并检查其末尾是否包含 .html 的条件。如果没有,它将继续执行第二行和第三行,另外两个条件。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    

    表示如果浏览器中指定名称的文件不存在,或者浏览器中的目录不存在,则继续执行第四行的重写规则。

    RewriteRule ^(.*)$ $1.html [L,R=301]
    

    正如您所说,这实际上是重写规则,它对您的 URL 进行更改并将.html 添加到 URL 的末尾。它使用 301 重定向来做到这一点,这是一种永久性的重定向形式。它还包括 [L] 标志,它基本上告诉服务器 - 在此迭代中不要处理以下任何规则

    我希望这有助于为您解决一些问题。如果您需要更多信息,请不要忘记您可以随时查看Apache Documentation

    【讨论】:

      【解决方案2】:

      @Lag 已经指出了这些指令的含义。

      RewriteCond %{REQUEST_URI} !^.*\.html$
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ $1.html [L,R=301]
      

      但是,此代码实际上并不能在每个目录的 .htaccess 文件中单独运行。这将导致无效的重定向。据推测,您的.htaccess 文件中的其他地方也有一个RewriteBase 指令?例如:

      RewriteBase /
      

      原因是$1 反向引用将包含一个相对 URL 路径(不以斜杠开头)。然后重新添加目录前缀,导致无效的外部重定向。 RewriteBase 指令覆盖目录前缀,使重定向有效。

      这也可以通过测试RewriteRule 模式.html 扩展的缺失而不是附加条件来稍微提高效率。例如:

      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule !\.html$ %{REQUEST_URI}.html [L,R=301]
      

      这是因为RewriteRule 指令实际上是要处理的第一件事,之前紧接在它之前的RewriteCond 指令。只有当RewriteRule pattern 匹配时,才会处理前面的RewriteCond 指令。如果RewriteCond 指令成功,则进行RewriteRule 替换

      这也不再依赖于RewriteBase 指令,因为REQUEST_URI 服务器变量已经具有斜杠前缀。

      如果您使用RewriteRule 模式,如^(.*)$,那么每个 请求都会被初始处理。 RewriteCond 指令later 失败,因此不进行替换。然而,早点失败总是比晚点好。

      提示:使用 302(临时)重定向进行测试以避免缓存问题。

      【讨论】:

      • 比我的答案好 1000 倍。将此标记为正确。
      • @Lag 谢谢,虽然我的回答更像是一个aside,而不是像你所做的那样直接回答问题。 (?)
      • 也许是这样,但是您发现了一个我什至没有考虑过的错误,该错误应该直接帮助 OP,然后提供了更好的解决方案来实现他们所需要的。无论哪种方式,很好的答案:)
      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 2013-10-22
      • 2010-09-21
      相关资源
      最近更新 更多