如何从静态页面的URL中删除.html
?
此外,我需要将任何带有.html
的URL重定向到没有.html
的URL(例如,将www.example.com/page.html
重定向到www.example.com/page
)。
如何从静态页面的URL中删除.html
?
此外,我需要将任何带有.html
的URL重定向到没有.html
的URL(例如,将www.example.com/page.html
重定向到www.example.com/page
)。
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]
我认为对Jon的回答进行一些解释会更有建设性。以下是:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
但这意味着什么?它使用正则表达式。这是我之前做的一点东西...
我认为那是正确的。
注意:在测试你的.htaccess
时,不要使用301重定向。在完成测试之前,请使用302,因为浏览器会缓存301。请参见https://dev59.com/t2ox5IYBdhLWcg3whUmm#9204355
更新:我稍微错了,.
匹配除换行符外的所有字符,因此包括空格。另外,这里有一个有用的正则表达式速查表
来源:
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
这应该对你有用:
#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]
使用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>
!-f
。 - Martijn/page.html
有一个文件,但你想用/page
链接到它。我怀疑这个答案误解了问题,并假设OP没有保存他的页面时没有使用.html
扩展名(据我所读,这并不是情况)。 - Kal你需要确保你也有 Options -MultiViews
。
以上方法在标准的 cPanel 主机上对我都没有起作用。
这个方法有效:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
如果你正在使用 Firebase Hosting,那么这个页面上的所有答案都行不通。因为 Firebase Hosting 不支持使用 .htaccess
文件。你需要配置 firebase.json 文件。只需在文件中添加一行代码 "cleanUrls": true
并保存即可。
添加该代码后,firebase.json 会变成这样:
{
"hosting": {
"public": "public",
"cleanUrls": true,
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
}
感谢您的回复。我已经解决了我的问题。假设我的页面在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>
好问题,但似乎让人有些困惑。答案几乎被分为两部分,一部分认为Dave(原帖作者)在保存HTML页面时没有使用.html
扩展名,另一部分则认为他保存了正常的HTML文件(包括.html
),但希望URL不显示它。虽然这个问题可能可以措辞得更好,但我认为他的意思很清楚。如果他在保存页面时没有使用.html
,那么他的两个问题(“如何删除.html”)和(“如何重定向任何带.html的URL”)将是完全相同的问题!因此,那种解释并没有太多意义。此外,他的第一个评论(关于避免无限循环)和他自己的答案似乎证实了这一点。
所以让我们重新表述这个问题并分解任务。我们想要完成两件事:
.html
是请求的URL的一部分(例如/page.html
),则可见地删除它。/page
)指回实际的文件(/page.html
)。做这两件事情都不难。(我们只需通过启用MultiViews来实现第二件事情。)这里的挑战是在不创建无限循环的情况下同时完成它们两个。
Dave的答案解决了问题,但相当复杂且不太可移植。(抱歉Dave。)Łukasz Habrzyk似乎整理了Anmol的答案,最后Amit Verma改进了它们两个。然而,他们都没有解释他们的解决方案如何解决根本问题——如何避免无限循环。据我所知,它们之所以有效是因为THE_REQUEST
变量保存了浏览器发出的原始请求。因此,条件(RewriteCond %{THE_REQUEST}
)只会被触发一次。由于它不会在重写时被触发,所以避免了无限循环的情况。但是你要处理完整的HTTP请求-GET,HTTP等-这在某种程度上解释了这个页面上一些难看的正则表达式示例。
我将提供另一种方法,我认为它更容易理解。我希望这有助于未来的读者理解他们正在使用的代码,而不仅是复制并粘贴他们几乎不理解但希望一切顺利的代码。
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]
让我们来分解一下...
第一个规则很简单。该条件匹配任何URL以.html
(或.htm
)结尾,并重定向到没有文件名扩展名的URL。这是一个永久性重定向,表示被裁剪的URL是规范化的URL。
第二个规则也很简单。如果所请求的文件名不是有效目录(!-d
),那么第一个条件只会通过。第二个条件只有在文件名引用带有.html扩展名的有效文件(-f
)时才会通过。如果两个条件都通过了,那么重写规则只是将“.html”添加到文件名中。然后魔法发生了...[END]
。是的,这就足以防止无限循环。Apache的RewriteRule Flags documentation对此进行了解释:
使用[END]标志不仅终止当前重写轮次(类似于[L]),而且还防止在每个目录(htaccess)上下文中发生任何后续的重写处理。
使用.htaccess
对静态 HTML 重写 URL 不仅不必要,而且会对您的网站性能产生负面影响。启用 .htaccess
也是一种不必要的安全漏洞 - 关闭它可以消除大量潜在问题。每个 .htaccess
文件的相同规则可以放入该目录的 <Directory>
部分,如果然后设置 AllowOverride None
,将更加高效,因为它不需要检查每个目录是否有 .htaccess
文件,更加安全,因为攻击者无法在没有 root 访问权限的情况下更改虚拟主机配置。
如果在 VPS 环境中不需要 .htaccess
,可以完全禁用它,并从您的 Web 服务器获取更好的性能。
您只需要将单独的文件从以下结构移动:
index.html
about.html
products.html
terms.html
对于这样的结构:
index.html
about/index.html
products/index.html
terms/index.html
你的 Web 服务器将呈现相应的页面 - 如果你加载 /about/
,它会将其视为 /about/index.html
。
然而,如果有人访问旧的网址,这样不会重写 URL,所以如果要对现有网站进行追溯应用,则需要设置重定向。
<Directory>
指令中即可。 - Matthew Daly我使用以下 .htaccess 文件来删除我的网站 URL 中的 .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]
RewriteBase /
部分。不幸的是,我不明白为什么它起作用,但我想我很快就会学到了。 - Keno