【问题标题】:htaccess redirection loop issuehtaccess 重定向循环问题
【发布时间】:2017-10-10 14:34:25
【问题描述】:

我有一个包含多个 html 页面的静态网站。为了不隐藏 url 中的 .html 扩展,我们在 htaccess 中为每个 url 设置了以下规则:

RewriteRule ^website-development$               website-development.html

这很好用,如果您打开 site.com/website-development,它实际上会打开 website-development.html 文件,但在 url 中它不显示 .html 扩展名。

现在,我们需要将.html url 重定向(或隐藏)到它们对应的不带 .html 的 url,例如如果有人在浏览器中打开site.com/website-development.html,则网址应显示为site.com/website-development
为此,我添加了以下规则:

 RewriteRule ^(.*)\.html$ /$1 [L,R]  

但这样做会导致无限期的重定向,因此浏览器只会不断地重定向,而不会呈现实际页面。您能否建议我如何将 site.com/website-developmentsite.com/website-development.html 重定向到 site.com/website-development (实际上是一个 html 文件 - website-development.html )。谢谢。

【问题讨论】:

    标签: html .htaccess redirect


    【解决方案1】:

    确实,这条规则会导致重定向循环:

    RewriteRule ^(.*)\.html$ /$1 [L,R]
    

    这是因为您的 REQUEST_URI 在 2 个不同的规则中添加和删除 .html 并且 mod_rewrite 在循环中运行。

    您可以根据使用THE_REQUESTRewriteCond 来使用此规则

    RewriteCond %{THE_REQUEST} \s/+(.+?)\.html[\s?] [NC]
    RewriteRule ^ /%1 [R=301,NE,L]
    

    THE_REQUEST 变量表示 Apache 从您的浏览器收到的原始请求,并且在执行某些重写规则后它不会被覆盖。此变量的示例值为GET /index.php?id=123 HTTP/1.1

    【讨论】:

    • 谢谢。让我试一次。
    • 它完全按照要求工作并解决了我的问题。非常感谢 :) 。我将阅读更多关于RewriteCondTHE_REQUEST 的信息,以获得更多的理解。另外,我在一些地方读到在我进行测试时不要使用R=301,对吗?
    • 是的,没错。在测试时保持R=302 或只是R 以避免浏览器缓存问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多