PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

FTP と FTPS> <サポートされるプロトコル/ラッパー
Last updated: Fri, 14 Nov 2008

view this page in

HTTP と HTTPS

PHP 4、PHP 5、PHP 6。https:// は PHP 4.3.0以降。

  • 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

HTTP 1.0 により HTTP GET メソッドを用いてファイル/リソースに読み込みのみの アクセスが可能です。仮想ホストにホスト名でアクセスするために、 Host: ヘッダが送信されます。 ini ファイルまたはストリームコンテキストによって user_agent 文字列を設定している場合、 それはリクエストの中にも含まれます。

警告

IIS のような、いくつかの標準に 対応してない Web サーバは、PHP に警告を発生させるような手順でデータを送信します。 このようなサーバを使用する場合は、 error_reporting を警告を発生しないレベルまで小さくする必要があります。 PHP 4.3.7 以降では、https:// ラッパーでストリームをオープンする際に バグがある IIS サーバソフトウエアを検出することができ、この警告を抑制することができます。 あなたが ssl:// ソケットを作成するために fsockopen() を使用している場合、 自らこの警告を検出し、抑制する必要があります。

PHP 4.0.5 以降、リダイレクトがサポートされています。これ以前のバージョンを 使用している場合、URL の末尾にスラッシュを付ける必要があります。 (全てのリダイレクトが処理された後に)ドキュメント取得元のリソースの URL を知ることが 重要な場合、ストリームから返された一連のレスポンスヘッダを処理する必要があります。

<?php
$url 
'http://www.example.com/redirecting_page.php';

$fp fopen($url'r');

/* PHP 4.3.0 の場合、stream_get_meta_data() の代わりに
   $http_response_header を使用してください */
$meta_data stream_get_meta_data($fp);
foreach(
$meta_data['wrapper_data'] as $response) {

  
/* リダイレクトされているか? */
  
if (substr(strtolower($response), 010) == 'location: ') {
    
/* $url をリダイレクト先に書き換える */
    
$url substr($response18);
  }

}

?>

ストリームにより、リソースの body にアクセスすることが できます。ヘッダは、$http_response_header 変数に保存されます。 PHP 4.3.0 以降は、ヘッダは stream_get_meta_data() により取得できます。

HTTP 接続は読み込みのみ可で、HTTP リソースにデータを書き込んだり ファイルをコピーしたりすることはできません。

注意: HTTPS は、PHP 4.3.0 以降で OpenSSL のサポートを組み込んだ場合にサポートされます。

ラッパーの概要
属性 サポートの可否
allow_url_fopen で制約される Yes
読み込み可 Yes
書き込み可 No
追記可能 No
同時読み書き可 N/A
stat() をサポート No
unlink() をサポート No
rename() をサポート No
mkdir() をサポート No
rmdir() をサポート No

バージョン 5 より前では、HTTP リクエストで独自のヘッダを送信することができます。 これは INI 設定項目 user_agent を処理する際の副作用によるものです。 user_agent に何らかの正常な文字列 (たとえばデフォルト設定の PHP/version など) を指定し、さらに続けて キャリッジリターン(\r) / ラインフィード(\n) を置いた後に任意のヘッダを記述します。 この方法は、PHP 4 以降のバージョンで動作します。

例1 HTTP リクエストで独自のヘッダを送信する

<?php
ini_set
('user_agent'"PHP\r\nX-MyCustomHeader: Foo");

$fp fopen('http://www.example.com/index.php''r');
?>

送信されるリクエストは次のようになります。

GET /index.php HTTP/1.0
Host: www.example.com
User-Agent: PHP
X-MyCustomHeader: Foo



add a note add a note User Contributed Notes
HTTP と HTTPS
Nick Lewis
26-Jun-2008 02:17
A note on how to deal with Cookies

To receive a cookie:

$httphandle = fopen($url,"r");
$meta = stream_get_meta_data($httphandle);
for ($j = 0; isset($meta['wrapper_data'][$j]); $j++) {
   $httpline = $meta['wrapper_data'][$j];
   @list($header,$parameters) = explode(";",$httpline,2);
   @list($attr,$value) = explode(":",$header,2);
   if (strtolower(trim($attr)) == "set-cookie") {
      $cookie = trim($value);
      break;
   }
}
fclose($httphandle);
echo $cookie;

To send a cookie:

$user_agent = ini_get("user_agent");
ini_set("user_agent",$user_agent . "\r\nCookie: " . $cookie);
$httphandle = fopen($url,"r");
fclose($httphandle);
ini_set("user_agent",$user_agent);
spazdaq
24-Oct-2007 01:27
just an FYI about digest authentication.

While one of the above http examples has the username and password info supplied with the url, this must only be for basic authentication. it does not appear to work for digest authentication. you have to handle the digest followup request on your own.
NEA at AraTaraBul dot com
30-Jul-2007 02: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 01: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 10: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.

 
show source | credits | sitemap | contact | advertising | mirror sites