PHP Curl 403エラーの解決方法

2850 ワード

自分の使う小さいPHPアプリケーションは、curlを使ってホームページをつかんで下に下りて処理して、壁を横切るのが便利なため、Privoxyを代理として使用して、どれらのウェブサイトを選んでproxy、どれらを使いますか?しかし、今日は変な問題がありました。google baiduを訪問すると、これらのサイトは全部403に戻ります。他のサイトを訪問するのは大丈夫です。proxyを使わないと正常に訪問できます。
google baiduはproxyで接続させないですか?明らかに不可能です。だから、ガールの情報出力を開けます。setopt($this->m Sh,CURLOPT_VERRBOSE,1)この結果を見てください。

*   Trying 127.0.0.1... * connected
* Connected to 127.0.0.1 (127.0.0.1) port 8118 (#0)
* Establish HTTP proxy tunnel to www.baidu.com:80
> CONNECT www.baidu.com:80 HTTP/1.0
Host: www.baidu.com:80
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Proxy-Connection: Keep-Alive

< HTTP/1.0 403 Connection not allowable
< X-Hint: If you read this message interactively, then you know why this happens ,-)
<
* The requested URL returned error: 403
* Received HTTP code 403 from proxy after CONNECT
* Closing connection #0
... Failed.

でproxyサーバが正常に動作しています。確かにbaiduが403エラーを返しましたが、原因はきっとまだ私のところにあります。ついに、インターネットからヒントを得ました。私はプロのxytunnelではなくプロのxyを使っています。
コードの中には、

 curl_setopt($this->mSh, CURLOPT_HTTPPROXYTUNNEL, true);
 curl_setopt($this->mSh, CURLOPT_PROXY, $phost);
phpドキュメントには詳しく説明されていませんが、man curlには詳細な説明があります。両方とも代理です。proxytunnelは他のプロトコルがhttpエージェントを通じて転送されることができます。proxy(-xパラメータ)はhttpプロトコルしかありません。ですから、google baiduのサーバーとcurlのproxytunnelは不和だと推測して、403に戻ります。
上記2行のコードを無効にした後、curlアクセスは正常になります。
不思議なことに、いくつかのオペレーティングシステムの下ではまだ違っています。一つのMAC OSXは明示的にプロxytunnelを禁止しなければなりません。curlバージョン:

$ curl --version
curl 7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Protocols: tftp ftp telnet dict ldap http file https ftps
Features: GSS-Negotiate IPv6 Largefile NTLM SSL libz
、もう一つのuuntuはまったく影響を受けません。どうやっても使えます。curlバージョン:

$ curl --version
curl 7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
MTホストのcentosも大丈夫です。MAC OSXは確かに違っています。
もう一つの理由は、curlが403に戻るエラーを引き起こすこともあります。設定されている場合:

$ curl --version
curl 7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Protocols: tftp ftp telnet dict ldap http file https ftps
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
は、次の設定が必要です。

 curl_setopt($ch, CURLOPT_NOBODY, true);
でなければ、httpサーバがHEADコマンドを許可しないため、403エラーに戻ります。参考:Trouble with a c URL request in PHP(http://forums.devshed.com/php-development-5/trouble-with-a-curl-request-in-php-445222.htmlを選択します。MAC OSXでcurlが特殊なのも、排除できないからでしょう。