如何获取正确本地文件路径?PHP域名方式include文件失败排查
1. 如何获取正确的本地文件路径?
兄弟,咱们先搞清楚本地文件路径的正确打开方式——绝对别用HTTP,那完全是走岔路了。PHP里获取本地路径有几个靠谱的方法:
- 用
__DIR__魔术常量:这会返回当前执行脚本所在目录的绝对路径,比如你的脚本在/var/www/html/blog/下,__DIR__就等于这个路径。如果header.php和当前脚本在同一个文件夹,直接写:
如果在上级目录,就用include __DIR__ . '/header.php';__DIR__ . '/../header.php';,直观又不容易踩坑。 - 用
$_SERVER['DOCUMENT_ROOT']:这是你的网站根目录的绝对路径(比如/var/www/html/),适合引用根目录下的公共文件,比如header.php在根目录的话:include $_SERVER['DOCUMENT_ROOT'] . '/header.php'; - 相对路径也能用,但要注意当前PHP的工作目录(可以用
getcwd()查看),容易因为执行环境变化出问题,所以优先用上面两种绝对路径的方式。
2. 为什么用HTTP URL引入
header.php会失败? 这事儿其实是PHP的include机制在搞鬼,我给你拆解下:
你写的$actual_link = "http://$_SERVER[HTTP_HOST]";拼出来的是一个HTTP URL,而PHP的include/require如果传入URL的话,本质是发起一个远程HTTP请求——这时候你的Web服务器会把header.php当成普通请求处理:先解析执行header.php里的PHP代码,然后把输出的HTML/文本返回给当前脚本。
也就是说,你include进来的不是header.php的原始PHP源码,而是它执行后的结果(比如一堆HTML标签),自然没法起到引入PHP头部代码的作用。而且更关键的是,PHP默认在php.ini里把allow_url_include设为Off,直接禁用了这种远程文件包含的功能,这也是为了安全(防止恶意引入远程脚本)。
至于你说其他操作有效?比如用这个URL做跳转或者用file_get_contents()获取内容,那些操作本来就是处理HTTP响应的,自然能拿到结果,但include是用来加载本地PHP源码执行的,完全不是一个场景。
正确的做法就是用第一个问题里说的本地绝对路径,比如:
// 假设header.php和当前脚本同目录 include __DIR__ . '/header.php'; // 或者在根目录 include $_SERVER['DOCUMENT_ROOT'] . '/header.php';
内容的提问来源于stack exchange,提问作者Orik3ll0
相关产品推荐
相关产品推荐

