You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

htaccess访问无index.php目录时不重写URL的问题排查与解决

问题原因

当访问根目录(比如http://yourdomain.com/)时,请求的URI是/,而你第一条规则里的RewriteRule . route.php [L]中的模式.只能匹配至少包含一个字符的URI,空的/根本不会触发这条规则。这就导致Apache直接走默认的目录处理逻辑:要么显示目录列表(如果Options Indexes开启),要么返回403 Forbidden(如果目录索引被禁用)。

解决方法

调整两条RewriteRule的匹配模式,让它们能覆盖根目录的情况:

修改后的完整配置

RewriteEngine On

# 处理无index.php的目录(包括根目录)
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule ^/?$ route.php [L]
RewriteRule ^(.+/)$ route.php [L]

# 处理不存在的文件和目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . route.php [L]

或者更简洁的写法,把目录规则的匹配模式改成能匹配所有目录请求(包括根目录的/):

RewriteEngine On

# 匹配所有目录请求,且目录下无index.php
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule ^.*$ route.php [L]

# 处理不存在的文件和目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . route.php [L]

关键说明

  • ^/?$ 专门匹配根目录的/请求(/?兼容带或不带末尾斜杠的情况)
  • ^(.+/)$ 匹配所有带末尾斜杠的子目录请求
  • 或者用^.*$直接匹配任何URI,只要满足前面的目录和无index.php的条件

另外,如果你想彻底避免目录列表的干扰,可以在.htaccess开头加上:

Options -Indexes

这样即使重写规则没触发,也不会显示目录列表,而是直接返回403,但我们的重写规则已经覆盖了这种情况,所以这一步是可选的。

内容的提问来源于stack exchange,提问作者Jayy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:43:16