【发布时间】:2015-12-13 16:05:46
【问题描述】:
我最近更新了我的一台服务器,从那以后,我遇到了一些特定 PHP 命令的问题(见下文)。我相信这是一个配置问题,但我已经研究了一些事情并且不知道更多。所以也许你们中的一个人有一个好主意:
我使用以下代码在 Intranet 站点上显示标准徽标或用户定义的徽标:
if(L_HEADER) {
$logo = L_HEADER;
}
else {
$logo = 'logo.png';
}
$properties = getimagesize(CONFIG_URL . 'images/' . $logo)
L_HEADER 和 CONFIG_URL 是具有预定义值的常量(另一个文件):
- L_HEADER 包含“opb_beta.png”
- CONFIG_URL 包含“http://billing.intranet.opb/”
连接工作正常,Apache 日志文件的错误消息也证实了这一点:
PHP 警告:getimagesize(http://billing.intranet.opb/images/opb_beta.png):打开流失败:HTTP 请求失败! HTTP/1.1 404 未找到
在 /var/www/billing/templates/header.inc.php 第 42 行
所以第一个明显的结论是:路径是错误的。但事实并非如此,相信我。我检查了 1.000 次。事实上,第一个好奇心是图像在同一个文件的代码中的几行中正确显示和引用:
echo '<img src="' . CONFIG_URL . 'images/' . $logo . '"
width="' . $properties[0] . '" height = "' . $properties[1] . '" />";
当我得到上面提到的错误时,高度和宽度是“0”,但是查看源代码,URL很好,手动访问它会打开图像,当用手动值替换宽度和高度时,图像是显示得很好。
更奇怪的是(以及我目前的 finx),将 getimagesize 更改为以下内容时,它工作得很好:
$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo);
我会提到我正在使用 Apache 的重定向;这就是为什么在 URL 中看不到“public_html”,而在第二个示例的绝对路径中却看到它。
“file_exists”也是如此。 URL 不起作用,同一文件的绝对本地路径起作用。
另一个好奇心:在另一段代码中,我正在在线检查更新。在那里,我使用带有 file_exists 和 fopen 的“真实”公共 URL。我看起来像这样并且工作得很好:
if(file_exists('http://desk.co.cr/df_stable.txt') {
if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) {
// some other code
}
}
现在,我已经检查过的东西:
- 正确设置了整个路径的文件权限,www-data 是所有文件的组和所有者以及图像文件的读写权限
- allow_url_fopen 设置为“开启”。
- open_basedir 设置为“无值”,并且在 Apache 的虚拟主机定义中没有覆盖。
- 文件确实存在且语法+路径正确。
一些背景信息:
- 服务器在 Ubuntu 14.04 LTS 上运行
- Apache 2.4.7
- PHP 5.5.9
目前,我没有想法。
【问题讨论】:
-
您是否查看了 access_log 以查看真正请求的 url?也许你有一个不稳定的重写。
-
可能是服务器的主机文件?当您在服务器上为域执行 nslookup 时会发生什么?
-
@MarcB 是的,我检查了 access_log 和 error_log。两者都显示正确的 URL。我什至将其复制并粘贴到浏览器中进行检查,图像显示正常。
-
@Blowski:您的评论与以下@IMSoP 的评论方向相同。事实上,为了将内网与任何其他“正常”网站区分开来,这里运行的是 dnsmasq。 nslookup显示
nslookup billing.intranet.opbServer: 127.0.0.1Address: 127.0.0.1#53Name: billing.intranet.opbAddress: 158.120.100.152不要问为什么这个IP。这是我们 LAN 的本地 IP 地址 - 长篇大论 ;-)
标签: php file-exists getimagesize