如何.html从静态页面的URL中删除?
此外,我需要将任何网址重定向到没有网址的网址.html.(即www.example.com/page.html到www.example.com/page).
bin*_*unt 92
我认为对Jon的回答有些解释是有建设性的.下列:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Run Code Online (Sandbox Code Playgroud)
检查如果指定的文件或目录分别不存在,则重写规则继续:
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
但是,这是什么意思?它使用正则表达式(正则表达式).这是我之前制作的一些东西......

我认为这是对的.
注意:测试时.htaccess 请勿使用301重定向.使用302直到完成测试,因为浏览器将缓存301s.请参阅/sf/answers/644304881/
更新:我有点误,.匹配除换行符之外的所有字符,因此包括空格.此外,这是一个有用的正则表达备忘单
资料来源:
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
Jon*_*eig 71
使用apache下的.htaccess,你可以像这样重定向:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
至于从网址中删除.html,只需链接到没有.html的页面
<a href="http://www.example.com/page">page</a>
Run Code Online (Sandbox Code Playgroud)
小智 68
这应该适合你:
#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]
Run Code Online (Sandbox Code Playgroud)
sta*_*een 68
要从您的网址中删除.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]
Run Code Online (Sandbox Code Playgroud)
注意:如果你想删除任何其他扩展名,例如删除.php扩展名,只需在上面的代码中用PHP替换html.
Bra*_*ood 18
你需要确保你也有Options -MultiViews.
以上都不适用于标准cPanel主机.
这有效:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Run Code Online (Sandbox Code Playgroud)
Dav*_*ave 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>
Run Code Online (Sandbox Code Playgroud)
Har*_*ati 13
对于使用 Firebase 托管的用户,此页面上没有任何答案。因为您不能.htaccess在 Firebase 托管中使用。您必须配置 firebase.json 文件。只需"cleanUrls": true在文件中添加该行并保存即可。就是这样。
添加行 firebase.json 后将如下所示:
{
"hosting": {
"public": "public",
"cleanUrls": true,
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
我使用此.htacess从我的网址删除.html extantion,请验证这是正确的代码:
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]
Run Code Online (Sandbox Code Playgroud)
好问题,但它似乎让人们感到困惑。答案是那些谁想到戴夫(在OP)是拯救他的HTML页面几乎相等没有的.html扩展,如果谁以为他保存为普通(含.html),但想要的URL显示没有。虽然这个问题的措辞可以更好一些,但我认为他的意思很清楚。如果他保存没有.html. 所以这种解释没有多大意义。此外,他的第一条评论(关于避免无限循环)和他自己的回答似乎证实了这一点。
因此,让我们从重新表述问题并分解任务开始。我们想要完成两件事:
.html如果它是请求的 URL 的一部分,则明显地删除它(例如/page.html)/page)指向实际文件(/page.html)。做这两件事都没有什么困难。(我们可以实现通过简单地使第二个多视图)。这里的挑战是做他们既没有创造一个无限循环。
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]
Run Code Online (Sandbox Code Playgroud)
让我们分解一下……
第一条规则非常简单。该条件匹配任何以.html(或.htm)结尾的 URL,并重定向到不带文件扩展名的 URL。这是一个永久重定向,表明裁剪后的 URL 是规范的URL 。
第二条规则也很简单。只有当请求的文件名不是有效目录 ( !-d) 时,第一个条件才会通过。仅当文件名引用了-f添加了 .html 扩展名的有效文件 ( ) 时,第二个才会通过。如果两个条件都通过,重写规则只是将“.html”添加到文件名中。然后奇迹发生...... [END]。是的,这就是防止无限循环所需的全部内容。Apache RewriteRule Flags 文档对此进行了解释:
使用 [END] 标志不仅可以终止当前轮次的重写处理(如 [L]),还可以防止在每个目录 (htaccess) 上下文中发生任何后续的重写处理。
使用.htaccess重写静态 HTML 的 URL 通常不仅没有必要,而且对您的网站性能不利。启用.htaccess也是一个不必要的安全漏洞 - 关闭它可以消除大量潜在问题。每个.htaccess文件的相同规则可以改为进入<Directory>该目录的一个部分,如果您然后设置AllowOverride None它会更好,因为它不需要检查每个目录的.htaccess文件,并且更安全,因为攻击者无法更改没有 root 访问权限的 vhost 配置。
如果您.htaccess在 VPS 环境中不需要,您可以完全禁用它并从您的 Web 服务器获得更好的性能。
您需要做的就是从这样的结构中移动您的单个文件:
index.html
about.html
products.html
terms.html
Run Code Online (Sandbox Code Playgroud)
对于这样的结构:
index.html
about/index.html
products/index.html
terms/index.html
Run Code Online (Sandbox Code Playgroud)
然后,您的 Web 服务器将呈现适当的页面 - 如果您加载/about/,它会将其视为/about/index.html.
但是,如果有人访问旧的 URL,这不会重写 URL,因此,如果它被追溯应用于现有站点,则需要重定向才能到位。
| 归档时间: |
|
| 查看次数: |
205461 次 |
| 最近记录: |