©
Ce document utilise Manuel du site Web PHP chinois Libérer
http:// -- https:// — 访问 HTTP(s) 网址
允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。 HTTP 请求会附带一个 Host: 头,用于兼容基于域名的虚拟主机。 如果在你的 php.ini 文件中或字节流上下文(context)配置了 user_agent 字符串,它也会被包含在请求之中。
数据流允许读取资源的 body,而 headers 则储存在了 $http_response_header 变量里。
如果需要知道文档资源来自哪个 URL(经过所有重定向的处理后), 需要处理数据流返回的系列响应报头(response headers)。
The from directive will be used for the From: header if set and not overwritten by the 上下文(Context)选项和参数.
版本 | 说明 |
---|---|
4.3.7 | 检测 IIS 服务器避免 "SSL: Fatal Protocol Error" 错误。 |
4.3.0 | 添加 https://。 |
4.0.5 | 增加了对重定向的支持。 |
Example #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 = substr ( $response , 10 );
}
}
?>
Note: openssl 扩展启用后才能够支持 HTTPS 协议。
HTTP 连接是只读的;还不支持对一个 HTTP 资源进行写数据或者复制文件。
比如发送 POST 和 PUT 请求, 可以在 HTTP Contexts 的支持下实现。
[#1] Rainer Perske [2015-11-09 16:27:03]
Passing authentication information in the URL as in "https://user:password@example.com" works for HTTP "Basic" access authentication but not for HTTP "Digest" access authentication. You can use the cURL functions for servers requesting HTTP "Digest" access authentication.
[#2] dfgfdg at adf dot com [2014-09-20 10:39:47]
sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom sleep with your mom
[#3] NEA at AraTaraBul dot com [2007-07-29 16:06:50]
HTTP post function;
<?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;
}
?>
[#4] Sinured [2007-06-28 03:24:29]
If you want to send more than one custom header, just make header an array:
<?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');
?>
[#5] dwalton at acm dot org [2006-11-17 00:18:39]
As it says on this page:
"The stream allows access to the body of the resource; the headers are stored in the $http_response_header variable. Since PHP 4.3.0, the headers are available using stream_get_meta_data()."
This one sentence is the only documentation I have found on the mysterious $http_response_header variable, and I'm afraid it's misleading. It implies that from 4.3.0 onward, stream_get_meta_data() ought to be used in favor of $http_response_header.
Don't be fooled! stream_get_meta_data() requires a stream reference, which makes it ONLY useful with fopen() and related functions. However, $http_response_header can be used to get the headers from the much simpler file_get_contents() and related functions, which makes it still very useful in 5.x.
Also note that even when file_get_contents() and friends fail due to a 4xx or 5xx error and return false, the headers are still available in $http_response_header.