【问题标题】:Remove .html from URLs with a redirect使用重定向从 URL 中删除 .html
【发布时间】:2012-05-01 23:14:31
【问题描述】:

我们有一个网站,不幸的是所有的 URL 都有 .html 后缀,它是一个 Magento 安装,Magento 允许你在 CMS 上更改它,但不幸的是,所有这些带有 .html 后缀的 URL 都有一个很好的排名在谷歌。我们需要重定向到非.html

因此,考虑以下场景,我们正在从头开始重建此站点,因此我们在新站点上具有相同的 url,但没有 .html 后缀。

  • 现在是:www.example.de/cool-shoes.html
  • 将是:www.example.de/cool-shoes

所以www.example.de/cool-shoes.html 将不再存在,我一直在尝试使用 .htaccess 进行重定向,但没有成功。

到目前为止我已经尝试过:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule (.*)index\.html$ /$1 [R=301,L] 

和:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

但它似乎不起作用......有什么想法吗?

【问题讨论】:

    标签: apache .htaccess magento url-rewriting


    【解决方案1】:

    这适用于以 .html /product/raspberrypi.html 结尾的 URL ---> /product/raspberrypi/ (/product/raspberrypi/index.php) index.php 是隐藏的。我花了一段时间才弄清楚这一点。哈哈……

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

    您必须使用“REQUEST_URI”并将其添加到索引重定向规则之前,因为它可能会被应用程序覆盖。重要的是要知道它的 URI 不是我们试图重定向的文件名或目录,因为文件名在根文件夹 (Wordpress) 中都有 index.php。

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      RewriteEngine On
      RewriteRule ^(\w+)\.html$ /$1 [R=301,L]
      

      【讨论】:

      • 谢谢,但似乎没有任何改变,我知道我可以删除 magento CMS 上的前缀,但再见谷歌排名......“w+”是什么意思?我应该使用 [R=301, NC] 还是什么?
      • 它的作用是接受任何以 .html 结尾的请求(\w+ 匹配任何非空的字母数字字符串)并将其重定向到相同的地址,但没有 .html。我假设你想要别的东西,而 Vikas 的解决方案看起来很不错
      • 谢谢伙计,我认为你的方法是正确的,Vikas 解决方案很好,但正如我上面解释的,仅适用于 URL 存在的情况,在这种情况下,此 URL (.html) 将被删除,并且我希望每个人都被重定向到没有 .html 的新 url。我正在编辑主 .htaccess 并在正确的位置添加了您建议的行,但没有进行重定向,也许我通过在整个 magento 安装的主 .htacess 文件中添加此行做错了,我会尝试制作这家商店的一个单独的.htacess(我有一个多商店安装)谢谢!
      • 这条规则缺少[R=301,L],它告诉 mod rewrite 重定向而不是重写。 RewriteRule ^(\w+)\.html$ /$1 [R=301,L] 应该可以工作。
      【解决方案3】:

      这是对我有用的解决方案。

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

      【讨论】:

      • 当您的服务器实际上有以.html 结尾的文件但您不希望.html 出现在URL 中时,这些规则看起来很合适。
      • 这对我有用。从 URL 中删除了.html,但仍会加载所需的文件。谢谢帕特里克!
      【解决方案4】:

      尝试将以下内容添加到站点重定向 URL 根目录中的 .htaccess 文件中,并删除它。

      Options +FollowSymLinks -MultiViews
      DirectorySlash Off
      
      RewriteEngine On
      
      RewriteCond %{SCRIPT_FILENAME}/ -d
      RewriteCond %{SCRIPT_FILENAME}.html !-f
      RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]
      
      RewriteCond %{ENV:REDIRECT_STATUS} ^$
      RewriteRule ^(.+)\.html$ /$1 [R=301,L]
      
      RewriteCond %{SCRIPT_FILENAME}.html -f
      RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L]
      

      【讨论】:

        【解决方案5】:

        这将像http://example.com/page.html -> http://example.com/page 那样重写网址

        # Remove .html from url
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME}\.html -f
        RewriteRule ^(.*)$ $1.html
        

        【讨论】:

        • 此代码似乎添加了.html,而不是删除它。它似乎也是一个重写规则,而不是重定向规则。最后需要[R=301,L] 进行任何重定向。
        【解决方案6】:

        试试这个把你的 .htaccess 文件 重定向永久 www.mysite.de/cool-shoes.html www.mysite.de/cool-shoes 这可能对你有帮助

        【讨论】:

          【解决方案7】:

          好的,经过一些研究,并且未能通过重写规则实现这一点,以下代码行有效:

          redirectMatch 301 ^(.*)\.html $1
          

          这对于删除任何 url 扩展名并避免损坏的链接非常有用,希望将来对某人有所帮助...

          干杯!

          【讨论】:

          • 你好,为了澄清我的疑问,这条规则是做什么的?不是假设第一个参数是您将从请求中收到的表达式,而第二个参数是您将发送给 apache 的表达式?它们应该被切换 -> ^(.*) $1.html
          • 该规则正在删除.html。第一部分是匹配的内容:任何具有.html 的网址。 $1 是匹配括号中的内容:除了.html 之外的所有内容。
          • 我会添加一个$ 以确保.html 出现在URL 的末尾:redirectMatch 301 ^(.*)\.html$ $1
          【解决方案8】:

          按照steps,您将能够从 url 中删除 .html 而无需修改 .htaccess 文件。

          【讨论】:

          • 谢谢,只有当您的页面之前有 .html 后缀时,它才有效,但在这种情况下,这个带有 .html 的页面不存在。它确实存在于旧站点上,但不存在于新站点中,因此每次有人使用旧 ulr (www.mysite.de/thing.html) 时都会被重定向到 www.mysite.de/thing,而不是 404 Not成立。我认为这可以通过 htaccess 来实现,对吧?
          • 仅链接的答案质量不高。链接的内容可能会更改或变得不可用。让人们点击答案也不是用户友好的。至少在这里总结一下步骤会更好。
          猜你喜欢
          • 2017-05-22
          • 1970-01-01
          • 1970-01-01
          • 2011-12-03
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多