manuzhai Sun Mar 24 19:30:34 2002 EDT
Modified files:
/phpdoc/nl/functions http.xml
Log:
First version of HTTP module.
Index: phpdoc/nl/functions/http.xml
diff -u /dev/null phpdoc/nl/functions/http.xml:1.3
--- /dev/null Sun Mar 24 19:30:34 2002
+++ phpdoc/nl/functions/http.xml Sun Mar 24 19:30:33 2002
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- $Revision: 1.3 $ -->
+ <reference id="ref.http">
+ <title>HTTP functies</title>
+ <titleabbrev>HTTP</titleabbrev>
+
+ <partintro>
+ <simpara>
+ Met deze functies kun je de output die teruggezonden wordt naar de
+ remote browser manipuleren op het HTTP protocol niveau.
+ </simpara>
+ </partintro>
+
+ <refentry id="function.header">
+ <refnamediv>
+ <refname>header</refname>
+ <refpurpose>Stuur een raw HTTP header</refpurpose>
+ </refnamediv>
+ <refsect1>
+ <title>Beschrijving</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> wordt gebruikt om raw
+ <acronym>HTTP</acronym> headers te versturen. Zie de <ulink
+ url="&spec.http1.1;">HTTP/1.1 specificatie</ulink> voor meer
+ informatie over <acronym>HTTP</acronym> headers.
+ </para>
+ <para>
+ De optionele <parameter>replace</parameter> parameter geeft aan
+ of de header een vorige gelijkaardige header moet vervangen, of
+ een tweede header van hetzelfde type toe moet voegen. Standaard
+ zal hij vervangen, maar als je &false; meegeeft als tweede
+ argument kun je meerdere headeers van het zelfde type forceren.
+ Bij voorbeeld:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+header('WWW-Authenticate: Negotiate');
+header('WWW-Authenticate: NTLM',false);
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ Er zijn twee speciale header calls. De eerste is een header die
+ begint met de string "<literal>HTTP/</literal>" (case is onbelangrijk),
+ die wordt gebruikt om uit te zoeken welke HTTP status moet
+ worden verzonden. Bijvoorbeeld, als je Apache hebt geconfigureerd om
+ een PHP script te gebruiken om requests voor ontbrekende bestanden
+ af te handelen (door de <literal>ErrorDocument</literal> directive te
+ gebruiken), wil je er misschien voor zorgen dat je script
+ de goede status code genereert.
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+ header("HTTP/1.0 404 Not Found");
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ <note>
+ <para>
+ Als je de return status op deze manier wil instellen moet je
+ zorgen dat dit de eerste header is die je verstuurt. Vergeet niet
+ dat <function>setcookie</function> <function>header</function>
+ intern gebruikt en dat de sessie functies misschien proberen
+ om een cookie neer te zetten, zodat deze interfereren met het
+ instellen van een return status via
+ <literal>header("HTTP ...")</literal>.
+ </para>
+ </note>
+ <note>
+ <para>
+ In PHP 3 werkt dit alleen als PHP is gecompileerd als een
+ Apache module. Je kunt echter hetzelfde effect verkrijgen
+ door middel van het gebruiken van de
+ <literal>Status</literal> header.
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+header("Status: 404 Not Found");
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ </note>
+ </para>
+ <para>
+ De tweede speciale case is de "Location:" header. Deze header wordt
+ niet alleen teruggestuurd naar de browser, maar hij geeft ook een
+ <literal>REDIRECT</literal> (302) status code aan de browser tenzij
+ een <literal>3xx</literal> status code al eerder werd ingesteld.
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+header("Location: http://www.php.net/"); /* Stuur de browser naar de PHP web site */
+exit; /* Zorg dat de code hieronder niet wordt uitgevoerd */
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <note>
+ <para>
+ HTTP/1.1 heeft een absolute <acronym>URI</acronym> als argument voor
+ <ulink url="&spec.http1.1;-sec14.html#sec14.30">Location:</ulink>,
+ inclusief het schema, de hostname en absoluut pad, maar sommige
+ clients accepteren relatieve URIs. Je kunt normaal
+ <literal>$_SERVER['HTTP_HOST']</literal>,
+<literal>$_SERVER['PHP_SELF']</literal>
+ en <function>dirname</function> gebruiken om zelf een
+ absolute URI te maken van een relatieve:
+ <informalexample>
+ <programlisting>
+<![CDATA[
+header("Location: http://".$_SERVER['HTTP_HOST']
+ .dirname($_SERVER['PHP_SELF'])
+ ."/".$relative_url);
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ </note>
+ <para>
+ PHP scripts genereren vaak dynamische content die niet mag worden
+ gecached door de client browser of een proxy cache tussen de server
+ en de client browser. Je kunt veel proxies en clients kunnen forceren
+ het cachen uit te zetten met
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Datum in het verleden
+header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ // Altijd veranderd
+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>
+ Het zou kunnen dat je pagina's zelfs niet worden gecached als je
+ niet alle headers hierboven meestuurt. Er zijn een aantal opties
+ die gebruikers zelf kunnen instellen voor hun browser die ervoor
+ zorgen dat hun standaard caching gedrag verandert. Door de bovenstaande
+ headers mee te sturen kun je alle instellingen die anders zorgen dat
+ de output van je script wordt gecached overschrijven.
+ </para>
+ <para>
+ Bovendien kunnen de <function>session_cache_limiter</function>
+ en de <literal>session.cache_limiter</literal> configuratie
+ worden gebruikt om automatisch de correcte caching-gerelateerde
+ headers mee te sturen wanneer er sessies worden gebruikt.
+ </para>
+ </note>
+ </para>
+ <para>
+ Onthoud dat <function>header</function> moet worden aangeroepen
+ voor er output is verzonden, door normale HTML tags, lege regels in een
+ file, of vanuit PHP. Het is een veel voorkomende fout
+ om met <function>include</function>,
+ <function>require</function>, functies, of een andere file toegang
+ functie output te verzenden voordat <function>header</function>
+ wordt aangeroepen. Hetzelfde probleem bestaat wanneer
+ er een enkele PHP/HTML file wordt gebruikt.
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php require("user_logging.inc") ?>
+
+
+<?php header ("Content-type: audio/x-pn-realaudio"); ?>
+// Werkt niet, zie de lege regels hierboven
+]]>
+ </programlisting>
+ </informalexample>
+ <note>
+ <para>
+ In PHP 4 kun je output buffering gebruiken om dit probleem te voorkomen,
+ waarbij het begin van al je output naar de browser wordt gebuffered
+ op de server tot je het verzendt. Je kunt dit doen door
+ <function>ob_start</function> en <function>ob_end_flush</function>
+ aan te roepen in je script, of door de <literal>output_buffering</literal>
+ instelling in je <filename>php.ini</filename> of je server configuratie
+ files in te stellen.
+ </para>
+ </note>
+ </para>
+ <para>
+ Als je wil dat de gebruiker wordt gevraagd de data die je zendt
+ op te slaan, zoals een gegenereerd PDF bestand, kun je de
+ <ulink url="&url.rfc2183;">Content-Disposition</ulink> header gebruiken
+ om een standaard filenaam mee te geven en de browser te forceren de
+ opslaan dialoog te laten zien.
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+header("Content-type: application/pdf");
+header("Content-Disposition: attachment; filename=downloaded.pdf");
+
+/* ... output pdf file ... */
+]]>
+ </programlisting>
+ </informalexample>
+ <note>
+ <para>
+ Er is een bug in Microsoft Internet Explorer 4.01 die ervoor
+ zorgt dat dit niet werkt. Er is niks aan te doen. Er is ook een
+ bug in Microsoft Internet Explorer 5.5 dat hiermee
+ problemen veroorzaakt. Deze kan worden opgelost door up te graden
+ naar Service Pack 2 of later.
+ </para>
+ </note>
+ </para>
+ <para>
+ Zie ook: <function>headers_sent</function>,
+ <function>setcookie</function>, en de sectie over
+ <link linkend="features.http-auth">HTTP authenticatie</link>.
+ </para>
+ </refsect1>
+ </refentry>
+
+ <refentry id="function.headers-sent">
+ <refnamediv>
+ <refname>headers_sent</refname>
+ <refpurpose>Geeft &true; terug als de headers verzonden zijn</refpurpose>
+ </refnamediv>
+ <refsect1>
+ <title>Beschrijving</title>
+ <methodsynopsis>
+ <type>bool</type><methodname>headers_sent</methodname>
+ <void/>
+ </methodsynopsis>
+ <para>
+ Deze functie geeft &true; terug als de HTTP headers al zijn verzonden,
+ anders &false;
+ </para>
+ <para>
+ Zie ook: <function>header</function>
+ </para>
+ </refsect1>
+ </refentry>
+
+ <refentry id="function.setcookie">
+ <refnamediv>
+ <refname>setcookie</refname>
+ <refpurpose>Verstuur een cookie</refpurpose>
+ </refnamediv>
+ <refsect1>
+ <title>Beschrijving</title>
+ <methodsynopsis>
+ <type>int</type><methodname>setcookie</methodname>
+ <methodparam><type>string</type><parameter>name</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>value</parameter></methodparam>
+ <methodparam
+choice="opt"><type>int</type><parameter>expire</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>path</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>domain</parameter></methodparam>
+ <methodparam
+choice="opt"><type>int</type><parameter>secure</parameter></methodparam>
+ </methodsynopsis>
+ <para>
+ <function>setcookie</function> defineert een cookie dat wordt
+ meegezonden met de rest van de header informatie. Cookies
+ moeten worden verzonden <emphasis>voordat</emphasis>
+ enige andere headers worden verzonden (dit is een restrictie
+ van cookies, niet van PHP). Daarom moet je deze functie aanroepen
+ voor enige <literal><html></literal> of
+ <literal><head></literal> tags.
+ </para>
+ <para>
+ Alle argumenten behalve de <parameter>name</parameter> parameter
+ zijn optioneel. Als alleen het name argument aanwezig is, wordt
+ het cookie met die naam verwijderd van de remote client. Je mag
+ een willekeurig argument ook vervangen door een lege string
+ (<emphasis>""</emphasis>) om dat argument over te slaan.
+ De <parameter>expire</parameter> en <parameter>secure</parameter>
+ argumenten zijn integers en kunnen niet worden overgeslagen
+ met een lege string. Gebruik in plaats daarvan een nul
+ (<emphasis>0</emphasis>). De <parameter>expire</parameter> parameter
+ is een normaal Unix tijds integer zoals wordt teruggegeven door de
+ <function>time</function> of <function>mktime</function> functies.
+ De <parameter>secure</parameter> geeft aan dat het cookie alleen
+ mag worden verzonden over een veilige HTTPS verbinding.
+ </para>
+ <para>
+ Veel voorkomende fouten:
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ Cookies worden niet zichtbaar tot de volgende keer dat een pagina
+ waarop het cookie zichtbaar is wordt geladen.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Cookies moeten worden verwijderd met dezelfde parameters als waarmee
+ ze werden ingesteld.
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <simpara>
+ In PHP 3 worden meerdere aanroepen van <function>setcookie</function>
+ in hetzelfde script verwerkt in omgekeerde volgorde. Als je probeert
+ een cookie te verwijderen voordat je een nieuwe neerzet, moet je het
+ toevoegen doen voor het verwijderen. In PHP 4 worden meerdere
+ aanroepen van <function>setcookie</function> verwerkt in de volgorde
+ waarop ze worden aangeroepen.
+ </simpara>
+ <para>
+ Een paar voorbeelden volgen over hoe je cookies moet verzenden:
+ <example>
+ <title><function>setcookie</function> stuur voorbeelden</title>
+ <programlisting role="php">
+<![CDATA[
+setcookie ("TestCookie", $value);
+setcookie ("TestCookie", $value,time()+3600); /* expire in 1 hour */
+setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);
+]]>
+ </programlisting>
+ </example>
+ </para>
+ <para>
+ Wanneer je een cookie verwijdert moet je zorgen dat de expiratie
+ datum in het verleden is, om het verwijder mechanisme in je browser
+ te activeren. Er volgen voorbeelden hoe je in het vorige voorbeeld
+ verzonden cookies kunt verwijderen:
+ <example>
+ <title><function>setcookie</function> verwijder voorbeelden</title>
+ <programlisting role="php">
+<![CDATA[
+// set the expiration date to one hour ago
+setcookie ("TestCookie", "", time() - 3600);
+setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
+]]>
+ </programlisting>
+ </example>
+ </para>
+ <para>
+ Let er op dat het waarde deel van het cookie automatisch wordt
+ ge-urlencoded wanneer je het cookie verzendt, en wanneer het wordt
+ ontvangen, wordt het automatisch gedecodeerd en toegewezen aan
+ een variabele met dezelfde naam als de cookie naam. Om de inhoud
+ van ons test cookie in een script te zien, kun je simpelweg een
+ van de volgende voorbeelden gebruiken:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+echo $TestCookie;
+echo $HTTP_COOKIE_VARS["TestCookie"];
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ Je kunt ook array cookies zetten door array notatie in de cookie
+ naam te gebruiken. Dit heeft het effect dat er evenveel cookies
+ worden neergezet als je array elements hebt, maar als het cookie
+ wordt ontvangen door je script worden de waarden allemaal geplaatst
+ in een array met de naam van het cookie:
+ <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>
+ Voor meer informatie over cookies, zie Netscape's cookie
+ specificatie op <ulink
+ url="&spec.cookies;">&spec.cookies;</ulink>.
+ </para>
+ <simpara>
+ Microsoft Internet Explorer 4 met Service Pack 1 werkt niet
+ goed met cookies die hun path parameter hebben ingesteld.
+ </simpara>
+ <simpara>
+ Netscape Communicator 4.05 en Microsoft Internet Explorer 3.x
+ lijken cookies incorrect af te handelen wanneer het pad en de
+ tijd niet zijn ingesteld.
+ </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:
+vim600: syn=xml fen fdm=syntax fdl=2 si
+vim: et tw=78 syn=sgml
+vi: ts=1 sw=1
+-->
+