Php fsockopen有错误:HTTP/1.1 301永久移动,404

Php fsockopen有错误:HTTP/1.1 301永久移动,404,php,fsockopen,Php,Fsockopen,我使用此代码打开了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 = ''; whil

我使用此代码打开了
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位置:MS作者通过:DAV内容长度: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/代理检查

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

我敢肯定,代码没有任何问题。我已经在很多网站上进行了测试,没有发现任何问题

谁能解释一下这个问题吗


谢谢。

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

使用curl:

$ 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

基本上你的脚本工作得很好。有一些错误。一个是特定于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");

这就行了

试试
http://whatismyipaddress.com
(使用http://)删除请求中
主机:
标题中域名周围的
{}
。请注意:“未经事先书面许可,您不得使用脚本、代理、应用程序或以其他方式自动查询此网站。”@Phoenix。谢谢,我会注意的。这是正确的,它们会阻止客户端,它们认为是诸如curl、lynx之类的机器人,或者没有用户代理头的请求。他需要使用Firefox、Chrome、IE等的有效用户代理伪造请求。非常感谢Uzi和drew010我的问候。非常感谢hakre我的问候。伙计们,请稍等……不要让我遇到“高级代理检查”的问题whatismyipaddress.com/proxy-check此页面将检查访问者的托管DNS IP not REMOTE\u ADRR。是否可以这样做?要获取访问者的IP地址(最好是访问脚本的计算机,例如代理),可以使用
$\u SERVER['REMOTE\u ADDR']
。无论如何,这只是技术细节,与之相比。您正在使用的服务()是在愚弄访问者,因此我不会为他们提供任何支持。我只希望使用该服务来检测使用aproxy的访问者。我认为这不可能通过fsockopen实现,对吗?