如何从 URL 中删除. html?

如何从静态页面的 URL 中删除 .html

另外,我需要将任何带有 .html的 URL 重定向到没有它的那个 URL (即 www.example.com/page.htmlwww.example.com/page)。

351875 次浏览

使用 apache 下的.htaccess,你可以像下面这样重定向:

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

至于从 URL 中删除. html,只需链接到没有. html 的页面

<a href="http://www.example.com/page">page</a>
RewriteRule /(.+)(\.html)$ /$1 [R=301,L]

试试这个:)不知道它是否工作。

谢谢你的回复。我已经解决了我的问题。假设我的页面在 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>

我使用这个. 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]

这应该对你有用:

#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]

你需要确保你也有 Options -MultiViews

在标准的 cPanel 主机上,以上这些都不适合我。

这个方法奏效了:

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

我认为对 Jon 的回答的一些解释是有建设性的:

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

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

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

但这是什么意思呢? 它使用 Regex (正则表达式)。这是我早些时候做的一个小东西..。 enter image description here

我是 好好想想没错。

注意: 在测试 .htaccess 不要时使用301重定向。在完成测试之前使用302,因为浏览器将缓存301。见 https://stackoverflow.com/a/9204355/3217306

更新: 我有点搞错了,.匹配除换行符之外的所有字符,所以包括空格。另外,这里有一个有用的正则表达式备忘单

资料来源:

Http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-f-d/2034/2

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

要从 URL 中删除. 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 扩展,只需将上面代码中的 Html替换为 我不知道即可。

也看看这个 如何使用 htaccess 从 URL 删除 ABC0和 .php

要从 URL 中删除. 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]

谢谢

对于那些正在使用 Firebase 托管的人来说,没有一个答案可以在这个页面上工作。因为你不能在 Firebase 托管中使用 .htaccess。您必须配置 firebase.json 文件。只需在文件中添加 "cleanUrls": true行并保存它。就是这样。

在添加了 firebase.json 行之后,它看起来像这样:

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

使用 .htaccess重写静态 HTML 的 URL 通常不仅没有必要,而且对网站的性能也不利。启用 .htaccess也是一个不必要的安全漏洞——关闭它可以消除大量潜在的问题。对于每个 .htaccess文件,相同的规则可以放在该目录的 <Directory>部分中,如果设置 AllowOverride None,性能会更好,因为它不需要检查每个目录中的 .htaccess文件,而且更安全,因为攻击者不能在没有 root 访问权限的情况下更改 vhost 配置。

如果您在 VPS 环境中不需要 .htaccess,您可以完全禁用它,并从 Web 服务器获得更好的性能。

您所需要做的就是将您的个人文件从这样的结构中移动:

index.html
about.html
products.html
terms.html

像这样的结构:

index.html
about/index.html
products/index.html
terms/index.html

你的网络服务器将呈现适当的页面-如果你加载 /about/,它将视为 /about/index.html

不过,如果有人访问旧网站,这不会重写 URL,所以如果它被追溯应用到现有站点,那么它需要重定向才能到位。

问得好,但是它似乎把人们搞糊涂了。那些认为 Dave (OP)将他的 HTML 页面 没有保存为 .html扩展的人,以及那些认为 Dave 将其保存为正常(使用 .html)但希望 URL 不显示的人,答案几乎平分秋色。虽然这个问题本可以措辞得更好一些,但我认为他的意思已经很清楚了。如果他保存的页面没有 .html,他的两个问题(’如何删除。Html)和(如何用。Html’)将是完全相同的问题!所以这种解释没什么意义。此外,他的第一条评论(关于避免无限循环)和他自己的回答似乎证实了这一点。

所以,让我们从改变问题的措辞和分解任务开始。我们想要完成两件事:

  1. 如果 .html是请求 URL 的一部分(例如 /page.html) ,可以明显地删除它
  2. 将裁剪后的 URL (例如 /page)指向实际的文件(/page.html)。

做这两件事没有什么困难的。(只要启用 多视图,我们就可以实现第二个目标。)这里的挑战是在不创建无限循环的情况下完成 都有

戴夫自己的回答完成了工作,但是它相当复杂,而且根本不便于携带。对不起,戴夫尤卡斯 · 哈布尔奇克似乎已经清理了安莫尔的答案,最后阿米特 · 维尔马改进了他们两个。然而,他们都没有解释 怎么做,他们的解决方案解决了最根本的问题ーー如何避免无限循环。据我所知,它们之所以能够工作,是因为 THE_REQUEST变量保存了来自浏览器的原始请求。因此,条件(RewriteCond %{THE_REQUEST})只被触发一次。因为它不会在重写时被触发,所以可以避免无限循环场景。但是接下来要处理完整的 HTTP 请求ーー GETHTTP等等ーー这部分解释了本页中一些比较难看的正则表达式示例。

我将提供一个更容易理解的方法。我希望这可以帮助未来的读者理解他们正在使用的代码,而不是仅仅复制和粘贴他们几乎不理解的代码,并希望得到最好的结果。

RewriteEngine on


# Remove .html (or htm) from visible URL (permanent redirect)
RewriteCond %{REQUEST_URI} ^/(.+)\.html?$ [nocase]
RewriteRule ^ /%1 [L,R=301]


# Quietly point back to the HTML file (temporary/undefined redirect):
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [END]

我们来分析一下。

第一条规则很简单。该条件匹配任何以 .html(或 .htm)结尾的 URL,并重定向到没有文件扩展名的 URL。它是一个 永久的重定向,以指示裁剪后的 URL 是 < em > canonical 的 URL。

第二条规则也很简单。第一个条件只有在请求的文件名为 没有有效目录(!-d)时才会通过。只有当文件名引用了一个有效的文件(-f) ,并且。添加 html 扩展。如果 都有条件通过,重写规则只需添加‘。Html’到文件名。然后奇迹发生了... [END]。是的,这就是防止无限循环的全部方法。阿帕奇 重写规则标志文档解释道:

使用[ END ]标志不仅终止当前一轮的重写 处理(如[ L ]) ,但也防止任何后续重写 处理在每个目录(htaccess)上下文中发生的事件。

使用哈希标签。

可能不完全是您想要的,但它解决了删除扩展的问题。

假设您有一个保存为 about.html的 html 页面,并且您不想要那个讨厌的扩展,您可以使用散列标记并重定向到正确的页面。

switch(window.location.hash.substring(1)){
case 'about':
window.location = 'about.html';
break;
}

路由到 yoursite.com#about将带你到 yoursite.com/about.html。我使用这使我的链接更干净。

首先创建一个. htaccess 文件并将内容设置为-

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

下一步。例如,test.html 变成了仅仅测试,如果你想从另一个文件打开一个文件,那么也删除。和文件名

通过改进@amit-verma (https://stackoverflow.com/a/34726322/2837434)的答案,我对这个问题做出了自己的贡献:

在我的案例中,RewriteCond %{REQUEST_FILENAME}.html -f触发了一个问题(相信文件存在) ,甚至在我没有预料到的时候:

%{REQUEST_FILENAME}.html给了我所有这些病例的 /var/www/example.com/page.html:

  • www.example.com/page(预计)
  • www.example.com/page/(也很有可能)
  • www.example.com/page/subpage(意料之外)

因此,它试图加载的文件(相信如果是 /var/www/example.com/page.html)是:

  • www.example.com/page = > /var/www/example/page.html(ok)
  • www.example.com/page/ = > /var/www/example/page/.html(不行)
  • www.example.com/page/subpage = > /var/www/example/page/subpage.html(不行)

只有第一个实际上指向一个现有的文件,其他请求给我500个错误,因为它一直认为该文件存在,并重复附加 .html

我的解决方案是用 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.html -f代替 RewriteCond %{REQUEST_FILENAME}.html -f

下面是我的整个 .htaccess(我还添加了一个规则,将用户从 /index重定向到 /) :

# Redirect "/page.html" to "/page" (only if "/pages.html" exists)
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} /(.+)\.html [NC]
RewriteRule ^(.+)\.html$ /$1 [NC,R=301,L]


# redirect "/index" to "/"
RewriteRule ^index$ / [NC,R=301,L]


# Load "/page.html" when requesting "/page" (only if "/pages.html" exists)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.html -f
RewriteRule ^ /%{REQUEST_URI}.html [QSA,L]

下面是一个结果示例,可以帮助您理解所有情况:

考虑到我的服务器上只有2个 html 文件(index.html & page.html)

  • 重定向到 www.example.com
  • 重定向到 www.example.com
  • 渲染 /var/www/example.com/index.html
  • 重定向到 www.example.com/page
  • 渲染 /var/www/example.com/page.html
  • 返回未找到404
  • 返回未找到404
  • 返回未找到404
  • 返回未找到404

不再有500个错误


另外,为了帮助您调试重定向,请考虑禁用浏览器中的网络缓存(因为旧的301重定向我在缓存中,这可能会引起一些头疼问题) :

Screenshot of Google Chrome's console, showing how to disable the "network cache"

为此,必须将 URL 从/page.html 重写到/page 你可以很容易地在任何扩展上实现它,比如. html. php 等等

RewriteRule ^(.*).html$ $1.html [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

你会得到一个类似下面这样的 URL: 从 example.com/page.html 到 example.com/page 请注意,以下两个网址都可以访问

Example.com/page.html 和 example.com/page 如果不想显示 page.html 试试这个

RewriteRule ^(.*).html$ $1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

更多信息 给你

如果你有一个小的静态网站和 HTML 文件都在根目录。

打开每个 HTML 文件并进行下一步更改:

  1. “/”代替 Href = “ index.html
  2. 删除所有本地链接中的 Html。例如: “ Href = “ about.html””应该看起来像“ Href = “ about””。