http://

https://

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)选项和参数.

用法

  • http://example.com
  • http://example.com/file.php?var1=val1&var2=val2
  • http://user:password@example.com
  • https://example.com
  • https://example.com/file.php?var1=val1&var2=val2
  • https://user:password@example.com

可选项

封装协议概要
属性 支持
allow_url_fopen 限制 Yes
允许读取 Yes
允许写入 No
允许添加 No
允许同时读和写 N/A
支持 stat() No
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No

更新日志

版本 说明
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($response010)) == 'location: ') {

        
/* 更新我们被重定向后的 $url */
        
$url substr($response10);
    }

}

?>

注释

Note: openssl 扩展启用后才能够支持 HTTPS 协议。

HTTP 连接是只读的;还不支持对一个 HTTP 资源进行写数据或者复制文件。

比如发送 POSTPUT 请求, 可以在 HTTP Contexts 的支持下实现。

参见

User Contributed Notes

Rainer Perske 09-Nov-2015 04:27
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.
NEA at AraTaraBul dot com 29-Jul-2007 04:06
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;
}
?>
Sinured 28-Jun-2007 03:24
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');
?>
dwalton at acm dot org 17-Nov-2006 12:18
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.