2017-10-20 143 views
0

我有一个带有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] 

回答

0

好,添加另一个规则,明确以“文件扩展名”将请求重定向到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样式文件)。这些文件出了名的错误,很难调试,他们真的放慢了服务器。只有当你无法控制主机配置(读取:真正便宜的主机服务提供商)或者如果你有一个依赖编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。

+0

我已经试过了。这不起作用,因为它以无限循环结束。 (第五行尾部的斜线缺失:RewriteRule^/?(。+)\。html $/$ 1/[R = 301]) –

+0

我没有看到上面的规则集应该如何在无尽的重写循环中结束..当然你没有尝试过类似的东西?关于该尾随斜线:添加这样的斜杠是很少见的,这就是为什么我将它遗漏出去的原因...... – arkascha

+0

我复制了您的代码1:1,并且谷歌浏览器以ERR_TOO_MANY_REDIRECTS结尾。我用不同的浏览器和电脑试过了。尝试一下,你会遇到同样的问题。 –

相关问题