国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP Curl出現403錯誤的解決辦法

2024-05-04 23:23:56
字體:
來源:轉載
供稿:網友

自己用的小PHP應用,使用curl抓網頁下來處理,為了穿墻方便,使用Privoxy作為代理,便于選擇哪些網站使用proxy、哪些不用。但今天卻遇到了奇怪的問題,訪問google baidu這些網站居然都返回403錯誤,而訪問其他的一些網站沒事,如果設置為不使用proxy則都能正常訪問。

難道google baidu就不讓用proxy連接么?顯然不可能,所以打開curl的信息輸出(curl_setopt($this->mSh, CURLOPT_VERBOSE, 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 :80
> CONNECT :80 HTTP/1.0
Host: :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錯誤,但原因肯定還在我這邊。終于,從網上(1of2, 2of2)得到了點啟發──我使用的是proxytunnel而非proxy。

在代碼中,有這么一句:

復制代碼 代碼如下:


 curl_setopt($this->mSh, CURLOPT_HTTPPROXYTUNNEL, true);
 curl_setopt($this->mSh, CURLOPT_PROXY, $phost);


php文檔中沒有詳細說明,不過man curl中有詳細解釋,兩者都是代理,proxytunnel(-p參數)允許其他協議通過http代理傳輸,而proxy(-x參數)則只能走http協議。所以我猜測,google baidu的服務器和curl的proxytunnel不和,所以返回403。

禁用掉上面2行代碼的第一句后,curl訪問恢復正常。

比較奇怪的是,幾種操作系統下還不一樣,一臺MAC OSX就要顯式的禁用proxytunnel才可以,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


而另外一臺ubuntu則完全不受影響,怎么都能用,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也沒事,curl版本:

復制代碼 代碼如下:


$ 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版本問題,MAC OSX的確與眾不同啊。

還有一個原因也會導致curl返回403錯誤,如果設置了:

復制代碼 代碼如下:


 curl_setopt($ch, CURLOPT_NOBODY, true);


則需要緊跟著設置:

復制代碼 代碼如下:


 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');


不然會因為http服務器不允許 HEAD 命令而返回403錯誤。參考:Trouble with a cURL request in PHP()。MAC OSX上curl之所以特殊,也不排除是這種原因吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖边县| 澄迈县| 荔波县| 泗水县| 阳西县| 宝鸡市| 罗山县| 布尔津县| 丹棱县| 宁河县| 乾安县| 耒阳市| 泗水县| 额尔古纳市| 岑溪市| 宝坻区| 应城市| 区。| 个旧市| 康平县| 德格县| 乾安县| 漳平市| 昌宁县| 磐安县| 米易县| 屯门区| 通州区| 兴国县| 台江县| 延川县| 广宗县| 竹山县| 新乡市| 郁南县| 定日县| 固安县| 五常市| 赤壁市| 平江县| 乌兰县|