我的htaccess中有一段代码正在运行。(代码在不包含它的URL请求中添加.html。)
但我想知道它是如何运作的。我理解其中的大部分,但我不确定。
第一行:它包含了所有没有.html的内容
第二行:??
第三行:它排除目录?
第四行:在每个不排除的地方添加.html。
有人可以解释每一行吗?
RewriteCond %{REQUEST_URI} !^.*\.html$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.html [L,R=301]
感谢
答案 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(临时)重定向进行测试以避免缓存问题。