html - 使用 htaccess 文件删除 html 扩展名

标签 html .htaccess

我知道这是一个非常常见的话题,但没有一个解决方案适合我。 我已经尝试了几个答案:

answer 1

answer 2

answer 3

和推荐链接。

我正在使用的 htaccess 代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

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

然后我将我的链接从 services.html 更改为服务,即我删除了扩展名,还使用 ​​ftp 从文件名中删除了扩展名。

我得到的是浏览器中显示的页面代码,而不是实际页面。

我已经在我的服务器上检查了 mod_rewrite,它使用这段代码可以正常工作

RewriteEngine On
Options +FollowSymLinks
RewriteRule ^joomla\.html http://www.joomla.org/? [R=301,L]

最佳答案

你的文件应该仍然有 .html服务器上的扩展名,否则服务器/浏览器不会将其解释为 html 而是文本(这就是您在浏览器中看到代码的原因)。因此,再次使用 ftp 重命名服务器上的文件。

为了让您的服务器提供文件 /test.html当 url /test被访问,你想在内部重写它,即:

RewriteRule ^test[^/]$ test.html

^是匹配字符串的开头,$匹配结尾,所以只有当 url 完全匹配 test 时才会重写.它将将该请求重写为 test.html .重写是内部的,这意味着它不会重定向浏览器(地址栏中的 url 不会改变)。还有外部重写( [R] 附加到规则),它重定向浏览器。

此规则也只匹配不以尾部斜杠结尾的 url([^/] 表示“不是斜杠”)。稍后我们将处理带有尾部斜杠的 url。

您可以创建自定义 RewriteRule对于您要重写的每个页面:

RewriteRule ^foo[^/]$ foo.html
RewriteRule ^bar[^/]$ bar.html

如果你有很多页面,这会是很多工作,所以你可能想要重写所有的 url,例如foobar应该改写为 foo.html/bar.html , 和 foo/bar应该改写为 foo/bar.html .

您还可以使用正则表达式来匹配所有请求。但是你应该首先检查是否 foo实际上不是目录(它可能包含 index.html 并且是您要提供的子目录)。您还想检查是否 foo实际上并不是服务器文件系统上的文件。有两个重写条件来检查(参见 RewriteCond directive ):

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

现在您可以为所有请求添加重写规则:

RewriteRule ^(.+[^/])$ $1.html

$1是第一个捕获组的内容,正则表达式中的捕获组是放在()中的表达式括号。 .匹配任何字符,+修饰符表示“一个或多个”。

请注意,这会导致重写循环导致 500 错误 ( see this answer ),因此您还需要添加一个重写条件来检查 <request>.html 是否文件实际存在于文件系统中:

RewriteCond %{REQUEST_FILENAME}.html -f

此外,您可能不想重写已经具有 .html 的网址扩大。我认为没有必要,因为您已经有了上面的规则,在这种情况下会检查 <file>.html.html这可能不应该存在。但是如果你必须处理那个,你可以添加另一个条件:

RewriteCond %{REQUEST_FILENAME} !^.+\.html$

所以把它放在一起你的重写规则看起来像这样:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !^.+\.html$ # not really necessary
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+[^/])$ $1.html

您现在唯一需要处理的是带有尾部斜杠的 url。为此,我们只需添加一个简单的外部重写规则,如果 url 实际上与目录不匹配,则删除尾部斜杠:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R,L]

此规则仅匹配以 / 结尾的网址(正则表达式 /$ )并将尾部斜线之前的所有内容捕获为一个组(正则表达式 (.+) ),然后重定向到该组(不包含斜线)。注意 RL flags规则的背后。 R用于重定向,重定向浏览器(地址栏中的url更改)。 L是最后一个,这意味着在此之后不会应用其他规则,尽管在重写后将再次应用规则,这是应用其他规则的地方。


长话短说

RewriteBase /

# handle trailing slashes (if not a directory)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R,L]

# rewrite rule that internally adds the .html extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+[^/])$ $1.html

关于html - 使用 htaccess 文件删除 html 扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078338/

相关文章:

html - CSS滚动固定侧边栏

wordpress - 通过 htaccess 的特定 Wordpress 页面 SSL 异常

php - 使用 MySQL 数据库进行 URL 重写

html - 如何申请 float : left and display: inline on lower versions of IE?

html - 重置按钮的作用类似于提交按钮

html - HTML 电子邮件中的 Outlook 表格间距 - 没有常用的技巧

.htaccess - 规范链接 seo 友好

html - CSS 组织图问题

php - 在 Apache 服务器上找不到 Laravel 5.1 404

php - Htaccess : making Fake folder to get accessible/