2017-04-06 73 views
1

一般而言,服務器是否可以阻止PHP cURL請求?服務器可以專門阻止捲曲請求嗎?

我一直在每15分鐘向某個面向公衆的URL發出cURL請求,時間約爲6-8個月。突然有一天它停止工作,URL開始返回一個空字符串。

當我在瀏覽器中輸入URL或使用python get請求時,它會返回預期的數據。

我決定嘗試使用PHP中的file_get_contents()函數命中相同的URL,並且該方法也按預期工作。

因爲我現在發現了一個bandaid解決方案,cURL發送的默認頭文件和file_get_contents()之間是否有區別,它允許一個請求被阻塞,另一個請求通過?

+1

看到您的cURL請求會很有幫助,請在 – cmorrissey

+0

之上使用代理服務器。 – Gaurav

回答

3

一般來說,服務器是否可以阻止PHP cURL 請求?

的排序。如果您的用戶代理字符串看起來像來自curl,服務器可以阻止請求。嘗試使用-A選項來設置自定義用戶代理字符串。

curl -A "Foo/1.1" <url> 

編輯:哎呀我看到你說: 「從PHP」,所以只需設置CURLOPT_USERAGENT選項:

curl_setopt($curl, CURLOPT_USERAGENT, 'Foo/1.1'); 
1

忘記捲曲。從HTTP請求的角度思考它。所有的服務器看到的是。如果您的curl請求包含服務器可用於過濾請求的某些內容(例如用戶代理標頭),則可以使用它來拒絕這些請求。

1

許多網站根據用戶代理阻止您。我能想到的最佳解決方法就是在Chrome中打開開發者控制檯,然後點擊網絡標籤。轉到您嘗試訪問的網站的網址,並找到獲取您需要的數據的請求。右鍵單擊該請求並將其複製爲cURL。它將包含瀏覽器發送的所有標題。

如果您將所有這些標題添加到php的cURL請求中,web-server將無法區分curl和瀏覽器的請求之間的區別。

您需要每隔幾年更新一次這些標頭(有些網站嘗試禁止舊版本的Firefox或Chrome多年來一直濫用的舊版本)。

+0

啊哈,好東西!我從來沒有真正使用Chrome的開發者工具,我總是使用FF和/或Safari。我將該請求複製爲cURL,並確定它的工作。我在我的頭文件中做了一些調整,原始的cURL請求現在按預期工作。 我認爲你是對的 - 這可能只是讓我的用戶代理。仍然奇怪的是,一個PHP file_get_contents()請求將成功拉動URL並且原來的cURL請求不會再有了。 感謝您的幫助! – ryes31

+0

@ ryes31如果你用請求轟炸了那個網站(特別是如果那個網站沒有太多的用戶流量),我強烈建議實現一個包含大約5-10個可能的頭的數組,並隨機選擇一個用於請求。這樣看起來你就像一個小網絡,有很多不同的用戶在執行請求...... – Dimi