.htaccess删除.html扩展名并添加尾部斜杠并禁止.html文件
问题描述:
我有一个带有html文件的静态网站,我想在没有.html结尾和尾部斜杠的情况下调用它们。.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
不过的URL引线的两个版本相同页。我如何重定向(没有.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]
答
好,添加另一个规则,明确以“文件扩展名”将请求重定向到URL ...
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
样式文件)。这些文件出了名的错误,很难调试,他们真的放慢了服务器。只有当你无法控制主机配置(读取:真正便宜的主机服务提供商)或者如果你有一个依赖编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。
我已经试过了。这不起作用,因为它以无限循环结束。 (第五行尾部的斜线缺失:RewriteRule^/?(。+)\。html $/$ 1/[R = 301]) –
我没有看到上面的规则集应该如何在无尽的重写循环中结束..当然你没有尝试过类似的东西?关于该尾随斜线:添加这样的斜杠是很少见的,这就是为什么我将它遗漏出去的原因...... – arkascha
我复制了您的代码1:1,并且谷歌浏览器以ERR_TOO_MANY_REDIRECTS结尾。我用不同的浏览器和电脑试过了。尝试一下,你会遇到同样的问题。 –