.htaccess删除.html扩展名并添加尾部斜杠和禁止.html文件

时间:2017-10-20 12:11:07

标签: apache .htaccess

我有一个带有html文件的静态网站,我想在没有.html结尾和尾随斜杠的情况下调用它们。

例如:

www.test.com/test.html

应该在

下提供
www.test.com/test/

我通过以下.htaccess

进行了管理
Options -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^([^\.]+)/$ $1.html

但两个版本的网址都会导致同一页面。如何重定向(不使用.html)或为.html版本抛出404?

www.test.com/test.html

这是带有斜杠的工作解决方案。谢谢@arkascha!

Options -Multiviews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/?(.+)\.html$ /$1/ [R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([^\.]+)/$ $1.html [END]

1 个答案:

答案 0 :(得分:0)

好吧,添加另一条明确将请求重定向到带有“文件扩展名”的网址的规则......

Options -Multiviews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^/?([^\.]+)/?$ /$1.html [END]

如果上述规则集导致http状态500(“服务器内部错误”),那么您可能会运行非常旧版本的apache http服务器。在这种情况下,您必须使用L标志而不是END标志,并为第一个块添加一个附加条件:

RewriteEngine On

RewriteCond %{REQUEST_URI} .html$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/?(.+)\.html$ /$1/ [R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^/?([^\.]+)/?$ /$1.html [L]

一般提示:您应该始终更喜欢将此类规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。只有在您无法控制主机配置(读取:非常便宜的托管服务提供商)或者您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)的情况下,它们才被支持作为最后一个选项。 )。