如何将根路径“/”重定向到指定首页并在浏览器地址栏显示页面名?
要仅在访问根路径 / 时重定向,可以使用 RedirectMatch 301 ^/$ /home.html。这条规则精确匹配 /,返回外部重定向。浏览器随后请求 /home.html,地址栏也会显示该路径。
为什么现有配置没有达到预期
DirectoryIndex home.html 指定目录的默认页面。默认情况下,Apache 会直接返回首页内容,地址栏仍保留 /。Apache 的 DirectoryIndex 文档
下面这条规则会造成循环:
Redirect 301 / /home
Redirect 按路径前缀匹配,并将匹配后剩余的路径追加到目标地址。/ 能匹配所有以斜杠开头的路径,因此 /home 也会再次命中,产生 /homehome、/homehomehome 等地址。
下面的写法也无法实现精确匹配,因为 Redirect 不会把 $ 解释为正则表达式中的结束位置:
Redirect 301 /$ /home
需要正则匹配时,应使用 RedirectMatch。Apache 的 Redirect 与 RedirectMatch 文档
尝试 (3) 与尝试 (1) 使用的是同一条指令,放到 DirectoryIndex 后面也不能限制匹配范围。至于它为什么没有出现重定向效果,需要查看实际生效的配置和响应头才能判断。
根目录 .htaccess 配置
删除原来的 Redirect 301 / /home 等尝试规则,在网站根目录的 .htaccess 中写入:
Options -Indexes
DirectoryIndex home.html
RedirectMatch 301 ^/$ /home.html
其中:
^/$精确匹配根路径/。/home.html是目标路径,包含所需的文件扩展名。301表示永久重定向。
浏览器访问 /home.html 时,路径不匹配 ^/$,这条规则就不会再次触发。只要没有其他规则把 /home.html 重定向回 /,就不会形成循环。
RedirectMatch 属于 mod_alias,不依赖 RewriteEngine On。站点没有其他 RewriteRule 时,可以省略 RewriteEngine On。Options -Indexes 用于禁止目录列表,与地址栏变化无关。
使用 mod_rewrite 的等效配置
如果站点已经通过 mod_rewrite 管理路由,也可以在网站根目录的 .htaccess 中使用:
Options -Indexes
DirectoryIndex home.html
RewriteEngine On
RewriteRule ^$ /home.html [R=301,L]
两种方案选一种即可。如果还有其他 RewriteRule,将这条规则放在通用路由或兜底规则之前。
在根目录 .htaccess 中,Apache 会在匹配前移除目录前缀及开头的 /,所以根路径对应空字符串,应写成 ^$。直接放在 <VirtualHost> 中的规则则应匹配 ^/$。Apache 的 RewriteRule 匹配说明
R=301 让 Apache 返回外部重定向,浏览器据此更新地址栏;L 停止本轮后续重写规则的处理。Apache 的重写标志说明
验证与注意事项
调试时先将 301 改为 302,确认跳转正确后再改回 301,避免浏览器缓存错误的永久重定向。
先查看根路径的响应头:
curl -I https://www.website.com/
响应应返回配置的重定向状态码,且 Location 指向 /home.html。再检查目标页面:
curl -I https://www.website.com/home.html
确认目标文件存在,且响应没有将它重定向回 /。这些命令用于验证,尚未在实际站点测试。
如果规则没有生效,检查 .htaccess 是否位于该域名实际使用的文档根目录,以及 Apache 是否允许在该目录中使用这些指令。RedirectMatch 和重写指令需要相应的 FileInfo 覆盖权限;如果保留示例中的 DirectoryIndex、Options,还需允许使用这两条指令。出现配置错误时,查看 Apache 错误日志。
备注:内容仅供参考。
