使用重定向从 URL 中删除 .html

Posted

技术标签:

【中文标题】使用重定向从 URL 中删除 .html【英文标题】:Remove .html from URLs with a redirect 【发布时间】: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

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

【问题讨论】:

【参考方案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 来实现,对吧? 仅链接的答案质量不高。链接的内容可能会更改或变得不可用。让人们点击答案也不是用户友好的。至少在这里总结一下步骤会更好。

以上是关于使用重定向从 URL 中删除 .html的主要内容,如果未能解决你的问题,请参考以下文章

从 URL + 重定向中删除 .html [重复]

从 http 重定向到 https 时,从 url 中删除斜线

发送重定向时强制浏览器从 URL 中删除#hash

从 url 中删除/重定向 index.php 以防止重复的 url

从 301 重定向中删除查询字符串

nginx 重定向循环,从 url 中删除 index.php