NGINX Docker容器中PHP绝对路径引入文件失败及原理咨询
NGINX+PHP环境中文件绝对路径工作机制及问题解决
一、核心逻辑
- PHP里的文件系统绝对路径直接对应服务器本地的真实文件路径,和NGINX的
root配置不是同一个概念,别混淆。 $_SERVER['DOCUMENT_ROOT']的值由NGINX通过fastcgi_param传递给PHP,默认等于NGINX的root配置值,但如果NGINX location块或PHP-FPM配置里修改了fastcgi_param DOCUMENT_ROOT,这个值会跟着变化。- 直接写
/xxx/xxx这种绝对路径,是从服务器的根目录(/)开始查找文件,和NGINX的root目录无关。
二、你的问题拆解
已知NGINX根路径是/var/www/html/,index.php在/frontend/src目录,那服务器上index.php的真实路径应该是/var/www/html/frontend/src/index.php:
- 第一种写法
require_once($_SERVER['DOCUMENT_ROOT'] . "/frontend/src" . "/requests/Requests.inc");,若$_SERVER['DOCUMENT_ROOT']正确为/var/www/html/,拼接后路径是/var/www/html/frontend/src/requests/Requests.inc,出错说明要么$_SERVER['DOCUMENT_ROOT']没正确设置,要么文件实际路径不符。 - 第二种写法
require_once("/frontend/src" . "/requests/Requests.inc");,拼接后是/frontend/src/requests/Requests.inc,但服务器上该文件实际在/var/www/html/frontend/src/requests/Requests.inc,从根目录/找不到/frontend/src,自然报错。
三、可行解决办法
- 确认文件真实路径:在Docker容器内执行命令:
输出结果就是文件的绝对路径,直接用这个路径写find /var/www/html -name "Requests.inc"require_once即可。 - 修正
DOCUMENT_ROOT传递:检查NGINX配置的location块,确保存在正确的fastcgi_param配置:
这样fastcgi_param DOCUMENT_ROOT $document_root;$_SERVER['DOCUMENT_ROOT']就会等于NGINX的root值/var/www/html/,原代码的路径拼接就会生效。 - 用
__DIR__实现跨环境兼容:PHP的__DIR__变量表示当前脚本所在的绝对目录,比如index.php在/var/www/html/frontend/src/,__DIR__就是这个路径,直接写:
这种写法不依赖服务器配置,本地和Docker环境通用,是最稳妥的方案。require_once(__DIR__ . "/requests/Requests.inc");
内容的提问来源于stack exchange,提问作者Bogdan Madzhuga
相关产品推荐
相关产品推荐

