PHP子目录404主因是Web服务器配置错误:Apache需启用AllowOverride All和mod_rewrite并正确设置RewriteBase;Nginx需显式配置location块、正确使用alias/root及SCRIPT_FILENAME参数。

PHP子目录访问返回404,大概率不是PHP本身的问题,而是Web服务器(Apache或Nginx)未正确识别该子目录为可访问路径,或重写规则干扰了路由。直接看配置和常见断点。
Apache:检查.htaccess是否被禁用或失效
很多PHP项目(如Laravel、ThinkPHP)依赖.htaccess做URL重写,但Apache默认可能关闭AllowOverride,导致子目录下规则不生效,请求直接404。
-
AllowOverride None必须改为AllowOverride All(在VirtualHost或Directory块中) - 确认
mod_rewrite已启用:a2enmod rewrite(Debian/Ubuntu)或检查httpd.conf中LoadModule rewrite_module未被注释 - 子目录若含
.htaccess,确保其语法正确;常见错误是RewriteBase没设对,比如子目录叫/blog,就得写RewriteBase /blog/
Nginx:子目录location匹配缺失或优先级错乱
Nginx不会自动读取.htaccess,所有路由逻辑靠location块定义。子目录404,通常因为没配对应location,或try_files链没兜底到index.php。
- 若子目录路径为
/admin,需显式添加location /admin { ... }块 - 关键要继承PHP处理逻辑,例如:
location /admin { alias /var/www/html/myapp/admin/; index index.php; try_files $uri $uri/ /admin/index.php?$query_string; } location ~ ^/admin/.*\.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass php-fpm; } - 注意
alias末尾斜杠和root行为不同;用root时路径会拼接两次,极易404
PHP-FPM + Nginx:SCRIPT_FILENAME指向错误
即使Nginx把请求转给了PHP-FPM,如果SCRIPT_FILENAME构造错了,PHP找不到文件,也会返回404(而不是500),现象就是子目录下所有PHP脚本都打不开。
基于ECSHOP2.7.2制作,模板使用的是早期的凡客模板。整站大气,清爽。适合综合,鞋子,服饰类商城使用。具体安装方法在程序包中有说明,在使用之前请看下。 大体方法:1.上传程序至网站根目录,访问:域名/diguo (用户名:admin 密码:123456)2.设置好数据库信息,然后恢复数据,数据目录在www.shopex5.com下.3.修改data目录下的config数据库配置文件。4.登陆
立即学习“PHP免费学习笔记(深入)”;
- 典型错误配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;——当用alias时,$document_root不包含子目录路径,导致拼出的路径不存在 - 正确做法:用
$request_filename(Nginx 0.7.65+支持),它已是完整磁盘路径 - 或者手动拼:比如子目录映射到
/srv/app/backend,就写fastcgi_param SCRIPT_FILENAME /srv/app/backend$fastcgi_script_name;
路径权限与DocumentRoot边界
Web服务器只服务DocumentRoot(Apache)或root(Nginx)声明的目录及其子目录。如果子目录在DocumentRoot之外,或父目录无执行(x)权限,也会404。
- Linux下检查:
ls -ld /var/www/html/subdir,确保每级父目录都有x权限(即drwxr-xr-x类) - Apache中若用
Alias /subdir "/path/outside/docroot",必须配套并设Require all granted - Nginx中不能跨
root目录访问;想映射外部路径,只能用alias,且alias值必须是绝对路径
子目录404最常卡在重写规则失效或SCRIPT_FILENAME拼错这两处,尤其是Nginx用alias却沿用$document_root的惯性写法——这里几乎必出问题,调试时优先盯住这一行。










