【问题标题】:fsockopen have errors : HTTP/1.1 301 Moved Permanently and 404fsockopen 有错误:HTTP/1.1 301 Moved Permanently 和 404
【发布时间】:2012-01-09 04:31:14
【问题描述】:

我已经用这个代码打开whatismyipaddress.com

$fp = fsockopen("whatismyipaddress.com", 80, $errno, $errstr, 5);

if ($fp) {
    $url = "/";

    fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nConnection: close\r\n\r\n");
    $resp = '';

    while(!feof($fp)) {
        $resp .= fgets($fp, 1024);
    }

    echo "$resp";
}

我总是能看到这个错误

HTTP/1.1 301 永久移动日期:2011 年 11 月 29 日星期二 20:19:36 GMT 服务器:Apache/2.2.17 (Unix) DAV/2 位置:http://whatismyipaddress.com/ MS-Author-Via: DAV Content-Length : 0 连接: 关闭内容类型: text/html

我也用这个代码打开whatismyipaddress.com/proxy-check

$fp = fsockopen("whatismyipaddress.com", 80, $errno, $errstr, 5);

if ($fp) {
    $url = "/proxy-check";

    fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nConnection: close\r\n\r\n");
    $resp = '';

    while(!feof($fp)) {
        $resp .= fgets($fp, 1024);
    }

    echo "$resp";
}

并出现此错误

HTTP/1.1 404 未找到 日期:2011 年 11 月 29 日星期二 20:32:07 GMT 服务器:Apache/2.2.17 (Unix) DAV/2 内容长度:421 连接:关闭 内容类型:text/html ;字符集=iso-8859-1 未找到

在此服务器上找不到请求的 URL /proxy-check。

此外,在尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。 Apache/2.2.17 (Unix) DAV/2 服务器位于 {whatismyipaddress.com} 端口 80

我确定,代码没有任何问题。我已经在许多网站上进行了测试,我没有遇到任何问题

谁能解释一下这个问题?

谢谢。

【问题讨论】:

  • 试试http://whatismyipaddress.com(使用http://)
  • 删除请求中Host:标头中域名周围的{}
  • 请注意whatismyipaddress.com/terms-of-use:“未经事先书面许可,您不得使用脚本、代理、应用程序或以其他方式自动查询本网站。”
  • @Phoenix。谢谢我会照顾好。问候

标签: php fsockopen


【解决方案1】:

我会尝试在标题中使用另一个用户代理。 我确信他们正在使用某种基于标头的保护来阻止机器人。

使用卷曲:

$ curl -I 'http://whatismyipaddress.com'
HTTP/1.1 403 Forbidden
Date: Tue, 29 Nov 2011 20:48:28 GMT
Server: Apache/2.2.17 (Unix) DAV/2
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=iso-8859-1

但是,一旦尝试强制用户代理,它就会起作用:

$ curl -I -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1' 'http://whatismyipaddress.com'
HTTP/1.1 200 OK
Date: Tue, 29 Nov 2011 20:49:24 GMT
Server: Apache/2.2.17 (Unix) DAV/2
Set-Cookie: pt=f737a9bb1a119dcec75073f11b05d213; expires=Wed, 30-Nov-2011 20:49:24 GMT
MS-Author-Via: DAV
Vary: Accept-Encoding
Content-Type: text/html

【讨论】:

  • 这是正确的,他们阻止了他们认为是机器人的客户端,例如 curl、lynx 或没有用户代理标头的请求。他需要使用来自 Firefox、Chrome、IE 等的有效用户代理来欺骗请求。
  • 非常感谢 Uzi 和 draw010 致以最诚挚的问候。
【解决方案2】:

基本上你的脚本工作正常。有一些错误。一个是特定于 HTTP 的,请看这行代码:

fputs($fp, "GET $url HTTP/1.1\r\nHost: {whatismyipaddress.com}\r\nCon ...
                                       ^                     ^

去掉那些括号,HTTP 协议没有这些括号,你需要提供一个有效的主机名。解决方案:

fputs($fp, "GET $url HTTP/1.1\r\nHost: whatismyipaddress.com\r\nCon ...

然后远程站点会告诉您需要一个用户代理。将其添加为附加标题:

fputs($fp, "GET $url HTTP/1.1\r
Host: whatismyipaddress.com\r
Connection: close\r
User-Agent: Florian der Fensterputzer\r\n\r\n");

这样就可以了。 Demo.

【讨论】:

  • 非常感谢 hakre 致以最诚挚的问候。
  • 伙计们请等...不要离开我
  • “高级代理检查”的问题 whatismyipaddress.com/proxy-check 此页面将检查访问者的托管 DNS IP 而不是 REMOTE_ADRR。Deos 可以这样做吗?
  • 要获取访问者的 IP 地址(最好是访问您的脚本的计算机,例如代理),您可以使用$_SERVER['REMOTE_ADDR']。无论如何,这只是技术细节,与How to show different homepage based on the user's Country? 进行比较。您正在使用的服务 (whatismyipaddress.com) 恕我直言愚弄它的访客,所以我不会为他们提供任何支持。
  • 我只是想使用那里的服务来检测使用代理的访问者..我认为 fsockopen 不可能做到这一点吗?
猜你喜欢
  • 2014-07-05
  • 2017-06-13
  • 2014-12-30
  • 2017-01-01
  • 2019-07-15
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多