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
相关产品推荐
相关产品推荐

