[function.fopen]:无法打开流:HTTP请求失败! HTTP/1.1 401未授权

问题描述:

[function.fopen]:无法打开流:HTTP请求失败! HTTP/1.1 401未授权[function.fopen]:无法打开流:HTTP请求失败! HTTP/1.1 401未授权

我定期得到这个错误,即它只发生在随机时间,任何想法会导致这种情况,我检查了我的php.ini并将allow_url_fopen设置为true。

10.4.2 401未经授权

请求需要用户认证 。响应必须包含WWW认证报头 字段(第14.47节),其中包含适用于请求的 资源的 询问。客户端可以用合适的授权 头字段重复 请求(14.8节)。如果 请求已包含授权 凭证,则401响应 指示授权已被拒绝这些凭证的 。如果 401响应包含相同 挑战,因为前一响应,并 用户代理已经尝试 认证至少一次,那么 用户应提交这是在响应中给出的实体 ,因为 该实体可能包含相关的 诊断信息。 HTTP访问 认证在“HTTP 认证:基本和摘要 访问认证”[43]中进行了说明。

Status Code Definitions

您试图访问需要身份验证的网站,玛吉指出。 fopen()不支持HTTP Basic Authentication,因此您必须使用Client URL Library来实现此类功能。

This has been discussed before.

+2

这是不正确的。 http包装器支持基本认证。它不支持摘要式身份验证。 – Artefacto 2010-07-26 13:50:16

如果网站需要基本身份验证,你可以给你的凭据是这样的:通过读取头手动

fopen("http://user:[email protected]/path/to/resource", "r"); 

如果使用摘要身份验证,你必须处理它失败的响应,并发送一个新的正确的标题。请参阅HTTP context options了解如何阅读和设置标题,并了解HTTP authentication with PHP中的摘要是如何工作的。您可以使用cURL extensionHTTP PECL extension

任务 - 打开基本的HTTP身份验证。

$auth_header = 'Authorization: Basic '.base64_encode("$user:$password"); 

$f = fopen($url, $open_mode,false, stream_context_create(
    'http'=>array(
     'header' => array($auth_header,$some_other_header,$some_yet_header), 
    ), 
));