【问题标题】:ReWrite rule to add .html extension重写规则以添加 .html 扩展名
【发布时间】:2011-08-10 08:53:27
【问题描述】:

我需要一个规则来添加一个 .html 扩展名,只要有“不”尾随斜杠。

一位新客户最近更改了电子商务脚本,新版本以不同方式处理 SEO 并更改了所有 16,000 多个产品链接。这在网站被重新索引之前没有被捕获,所以我们需要将旧的重定向到新的..

以前所有产品都有这样的链接 domain.com/category/productname 但现在 domain.com/category/productname.html

类别链接没有变化,都是这样的 domain.com/category/(带有斜杠)

【问题讨论】:

    标签: .htaccess redirect


    【解决方案1】:

    @david-wolever 的答案将所有不以 .html(或根)结尾的内容重定向到添加了 .html 扩展名的同一 URL,这意味着它将 .html 扩展名附加到 CSS 和 JavaScripts 文件等内容中,例如它将 /style.css 重定向到 /style.css.html 这可能不是你想要的。后面还有空格!可能会导致@greggles 500s 的字符

    这会重定向不以点结尾且后跟 3 或 4 个字母数字字符的 URL:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{3,4}
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule ^(.*)$ $1.html
    

    或者为了更精细的控制,将您不希望 .html 附加到的扩展名列入白名单,例如

    RewriteCond %{REQUEST_URI} !\.(html|css|js|less|jpg|png|gif)$
    

    【讨论】:

    • 我可以只为一个网址转义吗?因为如果我在 wordpress 网站上使用它,我将无法进入管理页面。因为当我输入“domain/wp-admin”时,它会将我重定向到 domain/wp-admin.html 并返回 404。这个线程上的所有答案都会发生同样的事情。
    • 不幸的是,这不适用于带有哈希片段的 url,这限制了它的适用性
    【解决方案2】:

    此选项类似于@remco,但不需要使用 [R](发送回浏览器的“外部”重定向)。我还在第一个条件中添加了一个缺失的 \:

    Options FollowSymLinks
    
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^.*\.html$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html
    

    【讨论】:

      【解决方案3】:
      重写引擎开启 重写条件 %{REQUEST_URI} ! \.html$ 重写条件 %{REQUEST_URI} ! /$ 重写规则 ^(.*)$ $1.html

      你可能想在里面放一个 [R],或者其他东西。请参阅文档:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule(搜索“redirect|R”)。

      【讨论】:

      • 所以,我已经尝试过了(包括在末尾添加 [R=301,L]),但对于任何请求,我都会收到 500 错误。我在服务器上尝试了一个简单的 RewriteRule 并且它起作用了,所以我认为这存在缺陷,而不是该服务器上 .htaccess/mod_rewrite 的一般配置中存在缺陷。
      【解决方案4】:

      这是旧线程,但仍然值得为此问题发布一个有效/经过测试的答案:

      RewriteEngine On
      
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^([^.]+?)/?$ /$1.html [L,R=302]
      

      跳过RewriteCond %{REQUEST_FILENAME} !-f 条件,因为正则表达式模式不匹配任何带有点的URI。

      【讨论】:

      • 我的网站目前允许 example.com/test 和 example.com/test.html 工作。我想转发所有非 html 以强制 .html。我可以用你上面的,把 302 改成 301 吗?
      • 谢谢!你过去帮助过,我需要扭转设置。谢谢你。 stackoverflow.com/questions/39092679/…
      【解决方案5】:

      @paul.grov.es 的回答对我来说似乎很好,但后来我注意到我的 javascript 不再工作了。

      解决方案很明显,他提到:考虑到 javascript 扩展名只有 2 个字符,因此将“.html”添加到 url。

      所以,我的解决方案是:

      RewriteEngine On
      RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4}
      RewriteCond %{REQUEST_URI} !/$
      RewriteRule ^(.*)$ $1.html
      

      【讨论】:

      • 这实际上是正确的答案,因为所有其他答案都不能验证以不同 .html 扩展名结尾的 url 的存在,这个会检查它并验证它是否是目录。您只需将RewriteCond %{REQUEST_URI} !/$ 更改为RewriteCond %{REQUEST_FILENAME} !-d
      【解决方案6】:

      在重写之前确保 X.html 确实存在:

      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME}.html -f
      RewriteRule ^(.*)$ %{REQUEST_FILENAME}.html
      
      • 条件!-f文件不存在所要求的
      • 条件!-d 目录不存在所要求的
      • 条件-f请求的带有“.html”扩展名的文件确实存在

      【讨论】:

      • 这可能是这里最好的答案,我想它在 htaccess 文件中工作得很好,但是如果你像我一样把它放在虚拟主机块中,你需要使用 "% {DOCUMENT_ROOT}%{REQUEST_FILENAME}" 让 apache 将其用作文件路径,而不是 url。
      【解决方案7】:

      我对 nginx 的解决方案:

      强制.html扩展

      if ($request_filename !~ ^.+(.html|\/)$) {
          return 301 $scheme://$host$request_uri.html;
      }
      

      【讨论】:

        【解决方案8】:

        上述解决方案对我不起作用,
        我在以下位置找到了一个可行的解决方案:
        http://www.garron.me/bits/add-html-extension-nginx-apache-htaccess.html
        .htaccess 部分。

        RewriteCond %{REQUEST_URI} !^.*\.html$  RewriteCond
        %{REQUEST_FILENAME} !-f  RewriteCond %{REQUEST_FILENAME} !-d 
        RewriteRule ^(.*)$ $1.html [L,R=301]
        

        【讨论】:

          【解决方案9】:

          这种工作有很多答案,但到目前为止,自 apache 2.4 以来最简单的方法就是启用 MultiViews,请参阅官方文档https://httpd.apache.org/docs/2.4/content-negotiation.html

          我所要做的就是:

          <Directory /var/www/html>
            Options +MultiViews
          </Directory>
          

          这意味着如果我访问我的网站,例如example.com/dashboard 它只提供dashboard.html 而不需要任何重定向,并且它保持原来的URL不变(所以它不附加扩展名)。

          我无法在文档中找到有关哪些文件扩展名优先的细节,所以不确定如果目录中同时存在dashboard.html 和dashboard.php 会发生什么,或者更改优先顺序是否容易.

          【讨论】:

            【解决方案10】:

            我认为这是最好的方法

            RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+?)/?$ %{REQUEST_URI}.html [L,R=302]

            【讨论】:

              猜你喜欢
              • 2017-09-09
              • 2012-03-18
              • 2022-01-02
              • 1970-01-01
              • 1970-01-01
              • 2012-03-25
              • 1970-01-01
              • 2012-12-24
              • 2017-01-07
              相关资源
              最近更新 更多