移除index.php后CodeIgniter出现403错误的解决求助
看起来你的URL重写规则和Apache目录权限配置在联手搞事情!让我们一步步拆解问题:
问题根源分析
从错误日志可以明确看到:
[authz_core:error] AH01630: client denied by server configuration: C:/xampp/htdocs/mdcsoftware/system/patients
这说明当你访问subdomain.domain.com/system/patients时,Apache没有执行你的重写规则,而是直接尝试访问物理目录C:/xampp/htdocs/mdcsoftware/system/patients——但这个目录要么没有默认索引文件,要么被Apache的权限设置拒绝访问了。
为什么重写规则没生效?看你当前的.htaccess:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
其中RewriteCond %{REQUEST_FILENAME} !-d的意思是:如果请求的路径是一个真实存在的目录,就跳过重写。而system/patients正好是真实存在的物理目录,所以规则直接跳过,请求就落到了Apache的目录访问控制上,导致403。
解决方案
方案1:修改.htaccess,强制所有非文件请求走index.php
移除针对目录的排除条件,让所有不是真实文件的请求都转发到index.php处理:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L]
这样不管请求的是目录还是不存在的路径,只要不是真实文件,都会交给程序的index.php路由处理,就和你手动访问index.php/system/patients的效果一致。
方案2:确保Apache目录权限配置正确
如果修改.htaccess后还是不行,检查你的Apache配置文件(httpd.conf或虚拟主机配置)中网站根目录的权限设置,确保允许.htaccess生效并开放目录访问:
<Directory "C:/xampp/htdocs/mdcsoftware"> Options FollowSymLinks AllowOverride All # 允许.htaccess覆盖全局配置 Require all granted # 允许所有客户端访问该目录 </Directory>
修改后记得重启Apache服务。
方案3:针对特定目录单独配置
如果你不想修改全局重写规则,可以在system目录下新建一个.htaccess文件,强制该目录下的所有请求转发到根目录的index.php:
RewriteEngine On RewriteRule ^(.*)$ ../index.php/system/$1 [L]
验证
修改完成后,刷新页面点击subdomain.domain.com/system/patients链接,应该就能正常访问了。如果还有问题,可以再检查Apache错误日志,看是否有新的错误提示。
内容的提问来源于stack exchange,提问作者Beldion

