1
    $fileSource = "http://google.com";
    $ch = curl_init($fileSource);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($retcode != 200) {
        $error .= "The source specified is not a valid URL.";
    }
    curl_close($ch);

これが私の問題です。上記を使用して設定$fileSource = "http://google.com";すると機能しませんが、設定する$fileSource = "http://www.google.com/";と機能します。

問題は何ですか?

4

3 に答える 3

1

1 つは永続的にwww.ドメインにリダイレクト (301) し、もう 1 つは単に OK (200) と応答します。

ステータス コード 200 だけを有効と見なすのはなぜですか? CURL に任せてください:

curl_setopt($ch, CURLOPT_FAILONERROR, true);

マニュアルから:

返された HTTP コードが 400 以上の場合、サイレントに失敗する場合は TRUE。既定の動作では、コードを無視して通常どおりページを返します。

于 2012-05-04T04:07:44.137 に答える
0

表示されているのは、実際には 301 リダイレクトの結果です。コマンドラインから詳細なcurlを使用して返されたものは次のとおりです

curl -vvvvvv http://google.com
* About to connect() to google.com port 80 (#0)
*   Trying 173.194.43.34...
* connected
* Connected to google.com (173.194.43.34) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.25.0 (x86_64-apple-darwin11.3.0) libcurl/7.25.0 OpenSSL/1.0.1b zlib/1.2.6 libidn/1.22
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 04 May 2012 04:03:59 GMT
< Expires: Sun, 03 Jun 2012 04:03:59 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0

ただし、301 リダイレクトで提案されている実際の www.google.com に対して curl を実行すると、次のようになります。

curl -vvvvvv http://www.google.com
* About to connect() to www.google.com port 80 (#0)
*   Trying 74.125.228.19...
* connected
* Connected to www.google.com (74.125.228.19) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.25.0 (x86_64-apple-darwin11.3.0) libcurl/7.25.0 OpenSSL/1.0.1b zlib/1.2.6 libidn/1.22
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Fri, 04 May 2012 04:05:25 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1

200 OK と 301 REDIRECT の主な違いを示すためだけに、Google の応答の残りを切り捨てました。

于 2012-05-04T04:06:07.607 に答える
0

curl にリダイレクトに従うように明示的に指示してみてください

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

それでもうまくいかない場合は、一部のサイトでユーザー エージェントを偽装する必要があるかもしれません。

また、彼らが JS を使用している場合、あなたの不運をリダイレクトします。

于 2012-05-04T04:04:43.327 に答える