我知道这是一个非常常见的话题,但没有一个解决方案适合我。 我已经尝试了几个答案:
和推荐链接。
我正在使用的 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,例如foo
或 bar
应该改写为 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]
此规则仅匹配以 /
结尾的网址(正则表达式 /$
)并将尾部斜线之前的所有内容捕获为一个组(正则表达式 (.+)
),然后重定向到该组(不包含斜线)。注意 R
和 L
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/