PHP子目录访问404怎么解_PHP子目录404访问修复【方法】

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(在VirtualHostDirectory块中)
  • 确认mod_rewrite已启用:a2enmod rewrite(Debian/Ubuntu)或检查httpd.confLoadModule 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脚本都打不开。

  • 典型错误配置: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的惯性写法——这里几乎必出问题,调试时优先盯住这一行。