我有一个PHP函数,用于检查URL以确保(a。)存在某种服务器响应,并且(b。)它不是404。
它在我测试过的每个域/网址上运行得很好,但bostonglobe.com除外,它返回404有效网址。我猜这与他们的付费墙有关,但我的功能在nytimes.com和其他报纸网站上运行良好。
以下是返回404的示例网址:
我做错了什么?
function check_url($url){
$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
$result = curl_exec($curl);
if ($result == false) {
//There was no response
$message = "No information found for that URL";
} else {
//What was the response?
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($statusCode == 404) {
$message = "No information found for that URL";
} else{
$message = "Good";
}
}
return $message;
}
答案 0 :(得分:2)
问题似乎来自你CURLOPT_NOBODY
选项。
我已使用和不使用此行测试您的代码,http代码在404
出现时返回CURLOPT_NOBODY
,而200
则不在。CURLOPT_NOBODY
。
PHP manual通知我们设置HEAD
选项会将您的请求方法转换为{{1}},我的猜测是托管bostonglobe.com的服务器不会支持这种方法。
答案 1 :(得分:-1)
我用curl命令检查了这个URL。
AppDomain CreateUnsharingDomain()
{
AppDomain cad = AppDomain.CurrentDomain;
AppDomainSetup cads = cad.SetupInformation;
return AppDomain.CreateDomain("Dummy", cad.Evidence,
new AppDomainSetup
{
ApplicationName = cads.ApplicationName,
ApplicationBase = cads.ApplicationBase,
DynamicBase = cads.DynamicBase,
CachePath = cads.CachePath,
PrivateBinPath = cads.PrivateBinPath,
ShadowCopyDirectories = cads.ShadowCopyDirectories,
ShadowCopyFiles = cads.ShadowCopyFiles,
ApplicationTrust = cads.ApplicationTrust,
LoaderOptimization = LoaderOptimization.SingleDomain
});
//Not sure which other properties to copy...
}
CreateUnsharingDomain().DoCallBack(MyUWPDependentMethod);
它返回了一个错误。(HTTP / 1.1 404 Not Found)
我还使用了另一个命令wget。结果是一样的。
curl --head https://www.bostonglobe.com/news/politics/2016/11/17/tom-brady-was-hoping-get-into-politics-might-time/j2X1onOLYc4ff2LpmM5k9I/story.html
我还使用Web服务(HTTP请求生成器:http://web-sniffer.net/)检查了这种情况。 结果是一样的。
https://www.bostonglobe.com/中的其他网址个案仅适用于HEAD请求。 但我认为帖子页面(扩展名.html)不支持头部请求。
服务器管理员或程序员关闭头请求?
for php,
wget –server-response --spider https://www.bostonglobe.com/news/politics/2016/11/17/tom-brady-was-hoping-get-into-politics-might-time/j2X1onOLYc4ff2LpmM5k9I/story.html
或服务器软件(Apache及更多)限制HTTP请求。
例如,目的是减少服务器负载。