【问题标题】:wget fails on a local domainwget 在本地域上失败
【发布时间】: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。

标签: php apache wget


【解决方案1】:

原来问题不在于 wget,而在于防火墙设置。从防火墙后面执行的 wget 调用将域解析为外部 IP 地址,并且与外部 IP 地址的连接失败。在防火墙中更正此问题修复了 wget 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多