当尝试让 example.com/about 显示 example.com/about.html 而不将 URL 更改为 /about.html 时,最好的选择是什么。现在我正在尝试以下代码,它只返回 404 错误。
RewriteRule ^/about$ https://example.com/about.html [R=301,L]
编辑 #1 至威盛我目前已启用多视图,但仍然收到 404 错误。以下是我目前在 VirtualHost 中的设置
<Directory /var/www/public_html>
Options All +MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
答案1
而不是使用 mod_rewrite内部重写请求,您可以改用 MultiViews (mod_negotiation):
Options +MultiViews
mod_rewrite 允许您进行更复杂的 URL 重写,但是,如果您所做的只是删除文件扩展名,那么 MultiViews 就足够了 - 这就是它的设计目的。
当您发出请求/about
(有效目录中没有扩展名的 URL/文件)时,在启用 MultiViews 的情况下,mod_negotiation 将搜索与预期 mime 类型匹配的文件并将其作为内部请求返回。
更新:
Options All +MultiViews
这不是有效的语法(我假设您使用的是 Apache 2.2,因为在 Apache 2.4 上启动时会出现错误)。如Apache 文档:
警告
Options
将 a 与 a混合使用+
或者将 a 与不带 a 的 混合使用-
不是有效语法并且可能会导致意外结果。
为了表达All
,MultiViews
你需要两个指令:
Options All
Options +MultiViews
All
是默认设置(在 Apache 2.2 上),因此这可能不是必需的。但是,最好在单个指令中仅指定所需的选项,例如:
Options FollowSymLinks Includes MultiViews
答案2
你能像这样尝试一下吗:我认为它会起作用
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^about$ https://example.com/about.html [R=301,L]
您还可以使用重定向:
Redirect 301 /about http://example.com/about.html
Redirect 301 /any_dir/about http://example.com/about.html