PHP项目部署后,访问主域名正常,但进入子目录却返回404错误,是开发过程中经常遇到的部署问题。这种情况通常不是代码本身的问题,而是服务器环境配置不符合子目录的访问规则导致的。

常见诱因分析
在修复问题前,先明确可能导致PHP子目录404的常见原因:
- 服务器未开启子目录的URL重写功能,伪静态规则没有覆盖子目录路径
- 子目录的访问权限不足,服务器进程没有读取目录内文件的权限
- Apache或Nginx的配置文件没有正确设置子目录的根目录路径
- 子目录下的
.htaccess或者伪静态规则存在语法错误
Apache服务器修复方法
检查并配置.htaccess规则
如果子目录使用了伪静态,需要在子目录根目录下添加正确的.htaccess文件,规则如下:
# 开启重写引擎
RewriteEngine On
# 如果请求的不是真实存在的文件或目录,转发到index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
调整Apache主配置
打开Apache的虚拟主机配置文件,确保子目录对应的目录开启了AllowOverride权限:
<VirtualHost *:80>
ServerName example.ipipp.com
DocumentRoot /var/www/html
# 主目录配置
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 子目录配置,假设子目录为/var/www/html/subdir
<Directory /var/www/html/subdir>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
修改完成后重启Apache服务:
systemctl restart apache2 # 或者 service httpd restart
Nginx服务器修复方法
配置子目录的location规则
Nginx需要在虚拟主机配置中单独为子目录添加location配置,示例如下:
server {
listen 80;
server_name example.ipipp.com;
root /var/www/html;
index index.php index.html;
# 主目录PHP解析配置
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 子目录配置,假设子目录为subdir
location /subdir {
# 子目录的实际路径
root /var/www/html;
try_files $uri $uri/ /subdir/index.php?$query_string;
}
# PHP解析通用配置
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
修改完成后重启Nginx服务:
systemctl restart nginx
通用排查步骤
如果修改配置后仍然出现404,可以按照以下步骤排查:
- 检查子目录及内部文件的权限,建议设置为755,所有者设置为服务器运行用户,比如www-data
- 确认子目录下的入口文件index.php真实存在,且语法没有错误
- 查看服务器错误日志,Apache日志通常在/var/log/apache2/error.log,Nginx日志通常在/var/log/nginx/error.log,根据日志提示调整配置
- 如果是框架项目,检查框架的路由配置是否支持子目录访问,部分框架需要修改base_url配置
注意事项
修改服务器配置前建议先备份原配置文件,避免配置错误导致服务无法启动。如果使用的是虚拟主机没有修改主配置的权限,可以联系服务商开启对应的伪静态和目录权限,或者调整项目的部署结构,将子目录内容移动到主目录适配现有规则。