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 +--> +