使用重定向删除URL中的“.html”后缀

8
我们有一个网站,不幸的是所有的URL都带有.html后缀,这是一个Magento安装,Magento允许您在CMS上更改此设置,但不幸的是所有这些带有.html后缀的URL在Google排名很高。我们需要重定向到非.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

但它似乎无效... 有什么想法吗?

8个回答

12

好的,经过一些研究,并未能通过重写规则实现此目标,下面这行代码可行:

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

这非常有用,可以删除任何 URL 扩展名并避免损坏的链接,希望能对未来的某人有所帮助...

干杯!


你好,只是想澄清一下我的疑问,这个规则是做什么的?不应该第一个参数是你将从请求中接收到的表达式,第二个参数是你将发送给Apache的表达式吗?它们应该被交换 -> ^(.*) $1.html - alexserver
那个规则是去掉“.html”。第一部分是它所匹配的:任何具有“.html”的URL。$1是匹配括号中的内容:除了“.html”之外的所有内容。 - Stephen Ostermiller
1
我会添加一个 $ 来确保 .html 出现在 URL 的末尾:redirectMatch 301 ^(.*)\.html$ $1 - Stephen Ostermiller

8

这段代码似乎是添加 .html 而不是删除它。它还似乎是一个重写规则,而不是一个重定向规则。如果要进行任何重定向,它需要在结尾处加上 [R=301,L] - Stephen Ostermiller

4
尝试将以下内容添加到站点根目录中的.htaccess文件中,以重定向具有.html扩展名的URL并将其删除。
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]

2
这是我采用的解决方案。
    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 结尾的文件,但您不希望在 URL 中出现 .html - Stephen Ostermiller
这对我有用。从URL中删除了.html,但仍然加载所需的文件。谢谢Patrick! - DevLime

1

按照步骤操作,您将能够在不修改.htaccess文件的情况下从URL中删除.html。


谢谢,这实际上是有效的,只有在您的页面之前有 .html 后缀的情况下才有效,但在这种情况下,带有 .html 的此页面不存在。它确实存在于旧站点中,但在新站点中不存在,因此每当有人访问旧的 URL(www.mysite.de/thing.html)时,会被重定向到 www.mysite.de/thing,而不是 404 Not found。我认为可以通过 htaccess 实现这一点,对吗? - Kaßta
1
仅提供链接的答案质量不高。链接内容可能会更改或无法访问。而且,让人们点击答案也不够友好。最好至少在此处概述步骤。 - Stephen Ostermiller

1

这应该能解决问题:

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

谢谢,但好像没有任何变化,我知道我可以在Magento CMS上删除前缀,但是这样会影响Google排名...“w+”是什么意思?我应该使用[R=301,NC]还是其他东西? - Kaßta
好的,这段代码的作用是将以.html结尾的任何请求(\w+匹配任何非空的字母数字字符串)重定向到相同地址但没有.html。我假设你想要其他东西,而Vikas的解决方案似乎很不错。 - ᴘᴀɴᴀʏɪᴏᴛɪs
谢谢,伙计。我认为你走的是正确的方向。Vikas的解决方案很好,但正如我上面所解释的,只适用于URL存在的情况,在这种情况下,这个URL(.html)将被删除,我希望每个人都能被重定向到没有.html的新URL。我正在编辑主要的.htaccess文件,并在正确的位置添加了你建议的行,但没有进行重定向,也许我是通过将这行代码添加到整个Magento安装的主要.htacess文件中而做错了,我会尝试为这个商店制作一个单独的.htacess文件(我有一个多商店安装)。谢谢! - Kaßta
1
这个规则缺少[R=301,L],它告诉mod rewrite进行重定向而不是重写。 RewriteRule ^(\w+)\.html$ /$1 [R=301,L] 应该可以工作。 - Stephen Ostermiller

0
尝试将以下内容放入您的 .htaccess 文件中: Redirect permanent www.mysite.de/cool-shoes.html www.mysite.de/cool-shoes 这可能对您有所帮助。

0

这是针对以 .html 结尾的 URL 的处理方式 /product/raspberrypi.html ---> /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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接