PHP子目录404主因是Web服务器配置错误:Apache需启用AllowOverride All和mod_rewrite并正确设置RewriteBase;Nginx需显式配置location块、正确使用alias/root及SCRIPT_FILENAME参数。
PHP子目录访问返回404,大概率不是PHP本身的问题,而是Web服务器(Apache或Nginx)未正确识别该子目录为可访问路径,或重写规则干扰了路由。直接看配置和常见断点。
.htaccess是否被禁用或失效很多PHP项目(如Laravel、ThinkPHP)依赖.htaccess做URL重写,但Apache默认可能关闭AllowOverride,导致子目录下规则不生效,请求直接404。
AllowOverride None必须改为AllowOverride All(在VirtualHost或Directory块中)mod_rewrite已启用:a2enmod rewrite(Debian/Ubuntu)或检查httpd.c
onf中LoadModule rewrite_module未被注释.htaccess,确保其语法正确;常见错误是RewriteBase没设对,比如子目录叫/blog,就得写RewriteBase /blog/
Nginx不会自动读取.htaccess,所有路由逻辑靠location块定义。子目录404,通常因为没配对应location,或try_files链没兜底到index.php。
/admin,需显式添加location /admin { ... }块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即使Nginx把请求转给了PHP-FPM,如果SCRIPT_FILENAME构造错了,PHP找不到文件,也会返回404(而不是500),现象就是子目录下所有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;
Web服务器只服务DocumentRoot(Apache)或root(Nginx)声明的目录及其子目录。如果子目录在DocumentRoot之外,或父目录无执行(x)权限,也会404。
ls -ld /var/www/html/subdir,确保每级父目录都有x权限(即drwxr-xr-x类)Alias /subdir "/path/outside/docroot",必须配套并设Require all granted
root目录访问;想映射外部路径,只能用alias,且alias值必须是绝对路径子目录404最常卡在重写规则失效或SCRIPT_FILENAME拼错这两处,尤其是Nginx用alias却沿用$document_root的惯性写法——这里几乎必出问题,调试时优先盯住这一行。