在URL中传递身份验证信息,例如 "https://user:[email protected]",适用于HTTP“基本”访问身份验证,但不适用于HTTP“摘要”访问身份验证。对于请求HTTP“摘要”访问身份验证的服务器,可以使用cURL函数。
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);
}
}
?>
在URL中传递身份验证信息,例如 "https://user:[email protected]",适用于HTTP“基本”访问身份验证,但不适用于HTTP“摘要”访问身份验证。对于请求HTTP“摘要”访问身份验证的服务器,可以使用cURL函数。
正如本页所述
"该流允许访问资源的主体;头信息存储在$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;
}
?>