这是网址:https://www.grammarly.com
我正在尝试使用nativeget_headers()
函数获取http头:
$headers = get_headers('https://www.grammarly.com')
结果是
HTTP/1.1 400 Bad Request
Date: Fri, 27 Apr 2018 12:32:34 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 52
Connection: close
但是,如果我使用
curl
命令行工具执行同样的操作,结果将不同:curl -sI https://www.grammarly.com/
HTTP/1.1 200 OK
Date: Fri, 27 Apr 2018 12:54:47 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 25130
Connection: keep-alive
这种反应差异的原因是什么?它是在grammarly的服务器端实现得很差的安全特性还是其他什么?
最佳答案
这是因为get_headers()
使用默认的流上下文,这基本上意味着几乎没有http头被发送到url,而大多数远程服务器都会对此感到不安。通常,丢失的头最有可能导致问题的是用户代理。您可以在使用get_headers()
调用stream_context_set_default
之前手动设置它。下面是一个对我有用的例子:
$headers = get_headers('https://www.grammarly.com');
print_r($headers);
// has [0] => HTTP/1.1 400 Bad Request
stream_context_set_default(
array(
'http' => array(
'user_agent'=>"php/testing"
),
)
);
$headers = get_headers('https://www.grammarly.com');
print_r($headers);
// has [0] => HTTP/1.1 200 OK