2017-04-06 101 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