【发布时间】:2014-05-30 21:30:36
【问题描述】:
我有一个 Red Hat linux 机器,其中 apache 运行多个域,包括 a.com 和 b.com。
我有一个 php 脚本 a.com/wget.php,它调用 exec() 来下载本地域 b.com 上的文件。从命令行运行php脚本就成功了。
但从网页运行此脚本会导致 404 错误。命令是:
/usr/bin/wget -k -S --save-headers --keep-session-cookies
-O <local-file-name> -o <local-log-file-name> -U \"Mozilla/5.0
(Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101
Firefox/24.0\" --max-redirect=100 "http://b.com/page.php"
没有日志消息写入到域 b.com 的 Apache 访问日志文件中。
但是服务器访问日志文件(/var/log/httpd/access_log)不是空的,它表明试图在服务器上打开页面“/page.php”(访问日志中的链接有没有域)。
xx.xx.xx.xx - - [19/May/2014:12:02:49 +0100] "GET /page.php
HTTP/1.0" 404 285 "-" "Mozilla/5.0 (Macintosh;
Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0"
服务器错误日志 (/var/log/httpd/error_log) 给出此错误:
[Mon May 19 12:02:49 2014] [error] [client xx.xx.xx.xx]
File does not exist: /var/www/vhosts/default/htdocs
所以看起来有些东西正在从“http://b.com/page.php”中剥离域名,而 wget 试图连接的结果 URL 是“/page.php”。这将不起作用,因为服务器上有许多域。
有人遇到过这个吗? wget 或 php 或 apache 中是否有一些设置会导致这种情况不会发生?我根据有关类似问题的建议尝试了不同的方法,但到目前为止没有任何效果。
谢谢。
【问题讨论】:
-
这意味着[文档根目录]/page.php 不存在。取决于虚拟主机设置。
-
b.com/page.php 确实存在。我可以从浏览器打开它。 b.com 的访问日志文件应该记录 /page.php 请求,即使该文件不存在。但是 b.com apache 日志文件中没有任何内容。
-
wget 必须发送任何标头(例如主机标头)才能访问该域的虚拟主机。尝试使用
var_dump($_SERVER);下载任何可用的脚本 -
我在wget调用中添加了--header="Host: b.com"(b.com是从$_SERVER获取的主机),还是没有变化。
-
还要检查 PHP 限制,例如 safe mode。尝试
shell_exec()而不是 exec。