htaccess重定向的说明

时间:2017-10-25 13:26:20

标签: html .htaccess

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

但我想知道它是如何运作的。我理解其中的大部分,但我不确定。

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

第二行:??

第三行:它排除目录?

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

有人可以解释每一行吗?

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

感谢

2 个答案:

答案 0 :(得分:1)

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

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

第一行只是一个抓取URI并检查它是否包含.html的条件。如果没有,它将进入第二和第三行,另外两个条件。

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

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

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

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

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

答案 1 :(得分:1)

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

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

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

RewriteBase /

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

通过测试.html 模式RewriteRule扩展名的绝对值,而非附加条件,也可以略微提高效率。例如:

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

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

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

如果您使用RewriteRule 模式,那么最初将处理每个请求。 ^(.*)$指令以后失败,因此未进行替换。然而,最好早点失败,而不是迟到。

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