.htaccess重新写入规则分离



你好 stackoverflow 社区,我目前正在编写.htaccess文件和想知道这是结合重写引擎规则的最佳方法。

例如,我的.htaccess文件现在由以下代码组成:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorDocument 404 /404.html

我想添加删除的扩展代码(用于.html):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.html [NC,L]

以及index.html可移动代码:

RewriteCond %{REQUEST_URI} index.html
RewriteRule ^(.*)index.html$ /$1/ [R=301,L]

哪个是要输入它们的适当顺序,最终的.htaccess文件代码应该如何?

预先感谢!

我会说这大致是您要寻找的:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^/?([^.]+)$ $1.html [END]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^/?(.+)/?$ /$1/index.html [END]
RewriteRule ^/?(.+/)index.html$ /$1 [R=301]
ErrorDocument 404 /404.html

您可能需要稍微划清一些事情,您的问题在几点中含糊不清。

如果您使用上述规则收到内部服务器错误(HTTP状态500),那么您可能会操作Apache HTTP服务器的非常旧版本。在这种情况下,您将在HTTP服务器错误日志文件中看到对不支持的[END]标志的明确提示。您可以尝试升级或使用较旧的[L]标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此规则同样可以在HTTP服务器主机配置或动态配置文件(" .htaccess"文件)中工作。显然,重写模块需要在HTTP服务器内加载并在HTTP主机中启用。如果您使用动态配置文件,则需要注意它的解释在主机配置中完全启用,并且它位于主机的DOCUMENT_ROOT文件夹中。

和一般说明:您应该始终更喜欢将此类规则放在HTTP服务器主机配置中,而不是使用动态配置文件(" .htaccess")。这些动态配置文件增加了复杂性,通常是出乎意料的行为的原因,难以调试,并且确实会减慢HTTP服务器。它们仅作为您无法访问真正的HTTP服务器主机配置(读:真正便宜的服务提供商)或坚持编写自己的规则(这是一个显然的安全噩梦)的情况的情况(读:真正便宜的服务提供商)或应用程序。

最新更新