1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.19 $ -->
<reference id="ref.http">
<title>HTTP関連の関数</title>
<titleabbrev>HTTP</titleabbrev>
<partintro>
<simpara>
以下の関数は、リモートブラウザに送り返される出力を、HTTPプロトコル
レベルで制御するためのものです。
</simpara>
</partintro>
<refentry id="function.header">
<refnamediv>
<refname>header</refname>
<refpurpose>生のHTTPヘッダを送信する</refpurpose>
</refnamediv>
<refsect1>
<title>説明</title>
<methodsynopsis>
<type>int</type><methodname>header</methodname>
<methodparam><type>string</type><parameter>string</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>replace</parameter></methodparam>
</methodsynopsis>
<para>
<function>header</function>関数は、<acronym>HTML</acronym>ファイル
の送信に先立って、生の<acronym>HTTP</acronym>ヘッダ文字列を送信
するために使用します。HTTPヘッダの詳細は、
<ulink url="&spec.http1.1;">HTTP 1.1 Specification</ulink>を参照
して下さい。
</para>
<para>
オプションのパラメータ <parameter>replace</parameter> は、ヘッダ
が前に送信された類似のヘッダを置換するか、または、同じ形式の二番
目のヘッダを追加するかどうかを指定します。デフォルトでは、この関
数は、置換を行ないますが、二番目の引数に&false; を指定すると、同
じ型の複数のヘッダを強制的に生成します。例えば、
<informalexample>
<programlisting role="php">
<![CDATA[
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM',false);
]]>
</programlisting>
</informalexample>
</para>
<para>
特殊なheaderコールが2種類あります。最初のは、"Location"
ヘッダーです。このヘッダーはブラウザに返されるだけではなく、
ApacheにREDIRECTステータスコードを返します。スクリプトの作者にとっ
ては、この点はあまり重要ではありませんが、Apacheの内部動作を知る
人にとっては、理解しておくべき重要なこととなります。
<informalexample>
<programlisting role="php">
<![CDATA[
header("Location: http://www.php.net/"); /* ブラウザをPHP Web サイトに
リダイレクトする */
exit; /* リダイレクトを行う際に以下のコードが
実行されないようにする */
]]>
</programlisting>
</informalexample>
</para>
<note>
<para>
HTTP/1.1では、スキーム、ホスト名、絶対パスを含む絶対
<acronym>URI</acronym>が<ulink
url="&spec.http1.1;-sec14.html#sec14.30">Location:</ulink>
の引数として必要ですが、いくつかのクライアントでは相対URIも受け
つけます。通常、相対URIから絶対URIを作成するために
$HTTP_SERVER_VARS['HTTP_HOST'],$HTTP_SERVER_VARS['PHP_SELF'],
<function>dirname</function>を使用することが可能です。
<informalexample>
<programlisting>
<![CDATA[
header("Location: http://".$HTTP_SERVER_VARS['HTTP_HOST']
."/".dirname($HTTP_SERVER_VARS['PHP_SELF'])
."/".$relative_url);
]]>
</programlisting>
</informalexample>
</para>
</note>
<para>
2番目の特別なヘッダは、文字列"<literal>HTTP/</literal>"
から始まる全てのヘッダ(大文字・小文字は区別されません)です。この
ヘッダは、送信するHTTPステータスコードを示すために使用されます。
例えば、存在しないファイルへのリクエストを処理するためにあるPHPスクリ
プトを使用するよう(<literal>ErrorDocument</literal>ディレクティブ
により)Apacheを設定する場合、そのスクリプトが正しいステータスコー
ドを返すようにする必要があります。
<informalexample>
<programlisting role="php">
<![CDATA[
header("HTTP/1.0 404 Not Found");
]]>
</programlisting>
</informalexample>
<note>
<para>
PHP 3では、このコードは、PHPがApacheモジュール版としてコンパイ
ルされている場合にのみ動作します。<literal>Status</literal>ヘッ
ダを用いて同じ効果を得ることが可能です。
<informalexample>
<programlisting role="php">
<![CDATA[
header("Status: 404 Not Found");
]]>
</programlisting>
</informalexample>
</para>
</note>
</para>
<para>
PHPスクリプトはしばしば動的に HTML を生成するため、クライアントブ
ラウザやサーバーおよびクライアントブラウザの間でプロキシがキャッ
シュを行ったりするべきではありません。多くのプロキシとクライアン
トでは、以下のコードにより強制的にキャッシュを無効にできます。
<informalexample>
<programlisting role="php">
<![CDATA[
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 日付が過去
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// 常に修正されている
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
]]>
</programlisting>
</informalexample>
<note>
<para>
上記のヘッダを全て出力しなかったとしてもページのキャッシュが行
われない場合があることに気付くかもしれません。デフォルトのブラ
ウザのキャッシュの動作をユーザが変更できる手段はいくつもありま
す。上記のヘッダを送信することにより、スクリプトの出力がキャッ
シュされる可能性がある設定を上書きするべきです。
</para>
<para>
加えて、<function>session_cache_limiter</function>および
設定<literal>session.cache_limiter</literal>をセッションが使用
された際にキャッシュ関係のヘッダを正しく自動的に生成するために
使用できます。
</para>
</note>
</para>
<para>
覚えておいて頂きたいのは、<function>header</function> 関数は、通
常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の出
力の前にコールする必要があることです。
頻出するエラーとして、<function>include</function> または
<function>require</function> 関数、他のファイルをアクセスする関数
に空白または空行があり、<function>header</function> の前に出力が
行われてしまうというものがあります。同じ問題は、単一の PHP/HTMLファ
イルを使用している場合でも存在します。
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php require("user_logging.inc") ?>
<?php header ("Content-type: audio/x-pn-realaudio"); ?>
// 動作しません。上の空行に注意して下さい。
]]>
</programlisting>
</informalexample>
<note>
<para>
PHP 4では、この問題に対処するために出力のバッファリングを使用す
ることが可能です。この場合、ブラウザへの出力が送信するまでサー
バに全てバッファリングされるオーバーヘッドがあります。出力バッ
ファリングは、<function>ob_start</function>と
<function>ob_end_flush</function>をスクリプトでコールするか
<filename>php.ini</filename>またはサーバ設定ファイルの設定ディ
レクティブ<literal>output_buffering</literal>を設定することによ
り行うことが可能です。
</para>
</note>
</para>
<para>
PDFファイルを生成するといったように送信するデータを保存するかどう
かユーザにプロンプトを表示したい場合、推奨されるファイル名を指定
してブラウザに保存ダイアログを表示させる<ulink
url="&url.rfc2183;">Content-Disposition</ulink>ヘッダを使用可能で
す。
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=downloaded.pdf");
/* ... PDFファイルを出力 ... */
]]>
</programlisting>
</informalexample>
<note>
<para>
Microsoft Internet Explorer 4.01にはこれが動作しないというバグ
があります。この解決策はありません。Microsoft Internet Explorer
5.5にもこれを妨げるバグがあります。これは、サービスパック2以降
とすることで修整可能です。
</para>
</note>
</para>
<para>
<function>headers_sent</function>,
<function>setcookie</function>及び
<link linkend="features.http-auth">HTTP認証</link>の節も参照下さ
い。
</para>
</refsect1>
</refentry>
<refentry id="function.headers-sent">
<refnamediv>
<refname>headers_sent</refname>
<refpurpose>ヘッダーが送信されている場合に &true; を返す</refpurpose>
</refnamediv>
<refsect1>
<title>説明</title>
<methodsynopsis>
<type>boolean</type><methodname>headers_sent</methodname>
<void/>
</methodsynopsis>
<para>
この関数は、HTTPヘッダが既に送信されている場合に &true; 、そうでな
い場合に &false; を返します。
</para>
<para>
<function>header</function>も参照下さい。
</para>
</refsect1>
</refentry>
<refentry id="function.setcookie">
<refnamediv>
<refname>setcookie</refname>
<refpurpose>クッキーを送信する</refpurpose>
</refnamediv>
<refsect1>
<title>説明</title>
<methodsynopsis>
<type>int</type><methodname>setcookie</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>string</type><parameter>
<replaceable><optional>value</optional></replaceable>
</parameter></methodparam>
<methodparam><type>int</type><parameter>
<replaceable><optional>expire</optional></replaceable>
</parameter></methodparam>
<methodparam><type>string</type><parameter>
<replaceable><optional>path</optional></replaceable>
</parameter></methodparam>
<methodparam><type>string</type><parameter>
<replaceable><optional>domain</optional></replaceable>
</parameter></methodparam>
<methodparam><type>int</type><parameter>
<replaceable><optional>secure</optional></replaceable>
</parameter></methodparam>
</methodsynopsis>
<para>
<function>setcookie</function> は、その他のヘッダ情報と共に
送信するクッキーを定義します。<parameter>name</parameter>
を除くすべての引数はオプションです。
クッキーは他のヘッダーを送信する<emphasis>前に</emphasis>送信
される必要があります。(これはクッキーの制約であってPHPの制約では
ありません)この制約により<literal><html></literal>または
<literal><head></literal>タグの前にこの関数をコールする
必要があります。
</para>
<para>
引数<parameter>name</parameter>以外の全ての引数はオプションです。
name 引数のみが指定された場合、nameという名前のクッキーはリモート
クライアントから削除されます。
全ての引数に関して引数の指定をスキップするために空文字列
(<emphasis>""</emphasis>)とすることが可能です。
<parameter>expire</parameter>および <parameter>secure</parameter> 引数
は空文字列でスキップすることはできません。代わりにゼロ
(<emphasis>0</emphasis>)を使用してください。
<parameter>expire</parameter>引数は、
<function>time</function> または <function>mktime</function> 関数により
返されたUNIX標準時を現す整数です。
<parameter>secure</parameter>は、クッキーがHTTPS接続によってのみ
伝送されることを指定します。
</para>
<para>
陥りやすい失敗:
<itemizedlist>
<listitem>
<simpara>
クッキーはクッキーを有効にするためにページを再ロードするまで
アクセスすることができません。
</simpara>
</listitem>
<listitem>
<simpara>
クッキーは設定されたものと同じパラメータで削除する必要がありま
す。
</simpara>
</listitem>
</itemizedlist>
</para>
<simpara>
PHP 3において同じスクリプトで<function>setcookie</function>を複数
回コールした場合、逆の順番で実行されます。他のクッキーを挿入する
前にあるクッキーを削除しようとする場合、削除する前に挿入を行う必
要があります。PHP 4では、<function>setcookie</function>を複数回コー
ルした場合でもコールした順番で実行されます。
</simpara>
<para>
クッキーを送信するいくつかの例を以下に示します。
<example>
<title><function>setcookie</function>による送信の例</title>
<programlisting role="php">
<![CDATA[
setcookie ("TestCookie", "Test Value");
setcookie ("TestCookie", $value,time()+3600); /* 1時間で期限切れ */
setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);
]]>
</programlisting>
</example>
</para>
<para>
上記の例で送信したクッキーを削除する方法の例を以下に示します。
<example>
<title><function>setcookie</function>による削除の例</title>
<programlisting role="php">
<![CDATA[
setcookie ("TestCookie");
// 有効期限を1時間前に設定する
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
]]>
</programlisting>
</example>
クッキーを削除する場合には、ブラウザの削除機構を起動するために必
ず有効期限を過去に設定する必要があります。
</para>
<para>
クッキーのvalueの部分は、クッキーの送信を行う際に自動的に
URLエンコードされ、またクッキーを受信した際は、自動的にデコード
されてクッキー名と同じ名前の変数に格納されることに注意して下さい。
すなわち、スクリプト内部でTestCookieの内容を見たい場合は、以下
の例のうちの一つを使用して下さい。
<informalexample>
<programlisting role="php">
<![CDATA[
echo $TestCookie;
echo $HTTP_COOKIE_VARS["TestCookie"];
]]>
</programlisting>
</informalexample>
</para>
<para>
クッキー名で配列を記述することにより、クッキーの配列を設定するこ
とも可能です。これにより配列要素と同数のクッキーを設定されますが、
クッキーがスクリプトに受信された際に、値はクッキー名を有する配列
に置きかえられます。
<informalexample>
<programlisting role="php">
<![CDATA[
setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie)) {
while (list ($name, $value) = each ($cookie)) {
echo "$name == $value<br>\n";
}
}
]]>
</programlisting>
</informalexample>
</para>
<para>
クッキーに関する詳細は、<ulink url="&spec.cookies;">&spec.cookies;
</ulink> にあるNetscapeのクッキーに関する仕様をご覧ください。
</para>
<simpara>
サービスパック1を適用したMicrosoftインターネットエクスプローラ4
は、パスに関するパラメータを設定したクッキーを正確に処理することが
できません。
</simpara>
<simpara>
Netscape Communicator 4.05およびMicrosoft Internet Explorer 3.x
は、pathとtime が設定されていない場合、クッキーを正確に処理する
ことができないようです。
</simpara>
</refsect1>
</refentry>
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|