【问题标题】:.htaccess remove .html extension and add trailing slash and disallow .html files.htaccess 删除 .html 扩展名并添加斜杠并禁止 .html 文件
【发布时间】:2017-10-20 21:03:13
【问题描述】:

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

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    好吧,添加另一个规则,将请求显式重定向到带有“文件扩展名”的 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 样式文件)。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器的速度。它们仅在您无法控制主机配置(阅读:非常便宜的托管服务提供商)或您有一个依赖于编写自己的重写规则的应用程序(这显然是安全噩梦)的情况下作为最后一个选项被支持)。

    【讨论】:

    • 我已经试过了。这不起作用,因为它以无限循环结束。 (第 5 行缺少斜杠:RewriteRule ^/?(.+)\.html$ /$1/ [R=301])
    • 我看不出上面的规则集应该如何以无限的重写循环结束...确定你没有尝试类似的东西吗?关于那个斜线:添加这样的斜线是不常见的,这就是我省略它的原因......
    • 我以 1:1 复制了您的代码,谷歌浏览器以 ERR_TOO_MANY_REDIRECTS 结尾。我用不同的浏览器和电脑试了一下。自己试试吧,你也会遇到同样的问题。
    • 我必须道歉!你当然是对的......我或多或少地盲目地复制了你的代码 ;-) 我在最后一条规则中添加了一个 [END] 标志,以防止重写引擎进入另一个循环,这确实会导致你观察到的问题。
    • 我还为旧的 apache http 服务器版本(2.4 版之前)添加了一个解决方法。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2012-04-15
    相关资源
    最近更新 更多