如何从URL中删除.html?


112

如何.html从静态页面的网址中删除?

另外,我需要将任何网址重定向.html到没有该网址的网址。(即www.example.com/page.htmlwww.example.com/page)。


1
“删除.html”是指“不需要显示.html”吗?
Lightness Races in Orbit

@Tomalak:是的,并且还将带有“ .html”的URL重定向到没有的URL。我的问题是,这导致无限重定向。我当前的设置允许www.example.com/page.html和www.example.com/page都可以访问,这对SEO不友好。
戴夫


@Tomalak:感谢您的提示。阅读mod_rewrite的文档非常有帮助。
戴夫

Answers:


105

我认为对乔恩回答的某些解释将具有建设性。下列:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

检查指定的文件或目录是否分别不存在,则重写规则将继续:

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

但是,这是什么意思?它使用regex(正则表达式)。这是我之前做的一些事情... 在此处输入图片说明

认为是正确的。

注意:测试时,.htaccess 请勿使用301重定向。使用302,直到完成测试为止,因为浏览器将缓存301。参见https://stackoverflow.com/a/9204355/3217306

更新:我有点误会,.匹配换行符以外的所有字符,因此包括空格。另外,这是一个有用的正则表达式备忘单

资料来源:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules


6
精湛的图表有助于解释答案。
里奇(Ric)

301s和浏览器缓存上的提示解决了我的问题。
bgfvdu3w

@KnocksX我不再是网站管理员,也无法提供帮助
binaryfunt

84

要从网址中删除.html扩展名,可以在root / htaccess中使用以下代码:

RewriteEngine on


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

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

注意:如果要删除任何其他扩展名,例如要删除.php扩展名,只需在上面的代码中用php替换html处的所有html


10
没有其他答案对我有用,但是这个答案确实有用,非常感谢!
Emmet Arries

2
这个也对我有用。谢谢@starkeen。进行^投票。
JeremyS

2
工作完美。谢谢!
ixany

这个为我删除了文件扩展名,但没有重定向到该页面
Bhargav Venkatesh

74

使用apache下的.htaccess,您可以像这样进行重定向:

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

至于从网址中删除.html,只需链接到不带.html的页面

<a href="http://www.example.com/page">page</a>

23
这对我没有任何帮助。有什么原因不起作用吗?
Michael Yaworski

您是否有所请求链接的实际文件?这将触发!-f
Martijn

72

这应该为您工作:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

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

3
我使用以下代码在Godaddy中获得了404,并修复了该问题:选项+ FollowSymLinks -MultiViews -Indexes位于最顶部。
Labanino

1
我认为这是最好,最完整的答案,谢谢!
ctekk

我尝试在localhost中执行此操作,但是它不起作用,是否还有其他需要执行的操作,是否必须链接.htaccess文件或页面如何识别它?
Pianistprogrammer

如何将example.com/page.html的.php扩展名添加到#301到example.com/page,这可能吗?

20

您还需要确保自己也有Options -MultiViews

在标准的cPanel主机上,上述方法都不适合我。

这工作:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

在以上所有答案中,最后一个有效。.我相信,因为我的网站托管在cPanel的godaddy上。关键是选项-MultiViews
Brad Vanderbush

是的,本节中没有任何内容可以期望得到这个答案!您节省了一天!
尼尔·班尼特

谢了哥们。我不确定为什么其他人没有按预期进行。
Nanoo

13

多谢您的回覆。我已经解决了我的问题。假设我的页面位于http://www.yoursite.com/html下,则适用以下.htaccess规则。

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>

6

我使用此.htacess从我的网址站点中删除了.html引文,请确认这是正确的代码:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]

这似乎对我有用,不像这里介绍的其他解决方案,谢谢。我要补充一点,尽管您仍然需要更新HTML中的链接(因此,如果您最初以<a href="page1.html"> </a>的形式链接到.html文件,则应更新(例如,<a href=" example.com/page1"> </ a >,然后它将起作用。)
Lorenzo 2014年

对我来说,最重要的变化是RewriteBase /位。不幸的是,我不知道它为什么起作用,但是我想我很快就会学到。
基诺·克莱顿

4

对于使用Firebase托管的用户,此页面上没有任何答案。因为您不能.htaccess在Firebase托管中使用。您将必须配置firebase.json文件。只需将行添加到"cleanUrls": true文件中并保存。而已。

添加行firebase.json后将如下所示:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

2

要从网址中删除.html扩展名,可以在root / htaccess中使用以下代码:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

谢谢


-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

试试这个:)不知道它是否有效。


4
如果不确定它是否有效,则不应将其发布为答案。
是否重要
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.