在 URL 中传递身份验证信息(如 "https://user:[email protected]")适用于 HTTP "Basic" 访问身份验证,但不适用于 HTTP "Digest" 访问身份验证。您可以使用 cURL 函数来处理请求 HTTP "Digest" 访问身份验证的服务器。
http:// -- https:// — 访问 HTTP(s) URL
允许通过 HTTP 读取访问文件/资源。默认情况下,使用 HTTP 1.0 GET。请求中会发送 Host:
标头以处理基于名称的虚拟主机。如果您已使用 php.ini 文件或流上下文配置了 user_agent 字符串,它也会包含在请求中。
该流允许访问资源的主体;标头存储在 $http_response_header 变量中。
如果必须知道文档来源的资源 URL(在处理完所有重定向后),则需要处理流返回的一系列响应标头。
示例 #1 检测重定向后的最终 URL
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {
/* 我们是否被重定向? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {
/* 使用重定向到的位置更新 $url */
$url = substr($response, 10);
}
}
?>
注意: 仅当启用了 openssl 扩展时才支持 HTTPS。
HTTP 连接是只读的;不支持写入数据或将文件复制到 HTTP 资源。
例如,发送POST 和PUT 请求可以使用 HTTP 上下文。
在 URL 中传递身份验证信息(如 "https://user:[email protected]")适用于 HTTP "Basic" 访问身份验证,但不适用于 HTTP "Digest" 访问身份验证。您可以使用 cURL 函数来处理请求 HTTP "Digest" 访问身份验证的服务器。
正如此页面所说
"该流允许访问资源的主体;标头存储在 $http_response_header 变量中。从 PHP 4.3.0 开始,标头可以使用 stream_get_meta_data() 获取。"
这句话是我发现的关于神秘的 $http_response_header 变量的唯一文档,我担心它很误导。它暗示从 4.3.0 开始,应该使用 stream_get_meta_data() 而不是 $http_response_header。
不要被骗了!stream_get_meta_data() 需要一个流引用,这使得它只对 fopen() 及其相关函数有用。但是,$http_response_header 可用于从更简单的 file_get_contents() 及其相关函数中获取标头,这使得它在 5.x 中仍然非常有用。
还要注意,即使 file_get_contents() 及其相关函数由于 4xx 或 5xx 错误而失败并返回 false,标头仍然可以在 $http_response_header 中获取。
HTTP post 函数;
<?php
function post_it($datastream, $url) {
$url = preg_replace("@^http://@i", "", $url);
$host = substr($url, 0, strpos($url, "/"));
$uri = strstr($url, "/");
$reqbody = "";
foreach($datastream as $key=>$val) {
if (!empty($reqbody)) $reqbody.= "&";
$reqbody.= $key."=".urlencode($val);
}
$contentlength = strlen($reqbody);
$reqheader = "POST $uri HTTP/1.1\r\n".
"Host: $host\n". "User-Agent: PostIt\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: $contentlength\r\n\r\n".
"$reqbody\r\n";
$socket = fsockopen($host, 80, $errno, $errstr);
if (!$socket) {
$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $reqheader);
while (!feof($socket)) {
$result[] = fgets($socket, 4096);
}
fclose($socket);
return $result;
}
?>
如果您想要发送多个自定义头部,只需将头部设置为数组即可
<?php
$default_opts = array(
'http' => array(
'user_agent' => 'Foobar',
'header' => array(
'X-Foo: Bar',
'X-Bar: Baz'
)
)
);
stream_context_get_default($default_opts);
readfile('http://www.xhaus.com/headers');
?>