htaccess重定向的解释



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

但我想确切地了解它是如何运作的。大部分我都懂,但我不确定。

第一行:它接受中没有.html的所有内容

第二行:??

第三行:是否排除目录?

第四行:在未排除的每一行上添加.html。

有人能解释一下每一行吗?

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

感谢

你几乎做到了!干得好。

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文档。

@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模式匹配时,才会处理前面的RewriteCond指令。如果RewriteCond指令成功,则进行RewriteRule替换

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

如果使用类似^(.*)$RewriteRule模式,则最初将处理每个请求。RewriteCond指令稍后失败,因此不会进行替换。然而,早失败总比晚失败好。

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

最新更新