1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 15:22:14 +01:00
Files
Martin Samesch eef5b860ac Sync with EN
2024-01-21 17:50:19 +01:00

357 lines
12 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: cefe817294283d42d0555951c02b9223a5a5ca4a Maintainer: sammywg Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: f32912d04f3da53ad720bd782ad5a2483a1d79a0 Reviewer: samesch -->
<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://docbook.org/ns/docbook" xml:id="function.header">
<refnamediv>
<refname>header</refname>
<refpurpose>Sendet einen HTTP-Header in Rohform</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>void</type><methodname>header</methodname>
<methodparam><type>string</type><parameter>header</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>replace</parameter><initializer>&true;</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>response_code</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
<para>
<function>header</function> wird zum Senden von
<acronym>HTTP</acronym>-Anfangsinformationen (Headern) im Rohformat
verwendet. Weitere Informationen über die <acronym>HTTP</acronym>-Header
finden Sie in der
<link xlink:href="&url.rfc;2616">HTTP/1.1-Spezifikation</link>.
</para>
<para>
Beachten Sie, dass Sie die Funktion <function>header</function> aufrufen
müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale
HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken. Es
handelt sich hier um einen typischen Fehler, der zum Beispiel auftritt,
wenn Sie Code mit Leerzeichen oder Leerzeilen, die ausgegeben werden,
mittels <function>include</function> oder <function>require</function> oder
einer anderen Datei-Zugriffsfunktion einlesen, bevor
<function>header</function> aufgerufen wird. Das gleiche Problem kann auch
auftreten, wenn Sie eine Datei verwenden, in der HTML und PHP vermischt
wurden.
<informalexample>
<programlisting role="php">
<![CDATA[
<html>
<?php
/* Dies wird einen Fehler provozieren. Beachten Sie die vorangehende
* Ausgabe, die vor dem Aufruf von header() erzeugt wird */
header('Location: http://www.example.com/');
exit;
?>
]]>
</programlisting>
</informalexample>
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>header</parameter></term>
<listitem>
<para>
Der Header-String.
</para>
<para>
Es gibt zwei Spezialfälle von Header-Aufrufen. Der erste ist ein
Header, der mit "<literal>HTTP/</literal>" beginnt (ob Groß- oder
Kleinschreibung ist nicht relevant). Dieser Header wird verwendet, um
den zu sendenden HTTP-Statuscode anzugeben. Wenn Sie zum Beispiel
Apache konfiguriert haben, ein PHP-Skript zum Bearbeiten von
Anforderungen fehlender Dateien (mittels der
<literal>ErrorDocument</literal>-Direktive) zu verwenden, möchten Sie
bestimmt sicherstellen, dass Ihr Skript den passenden Statuscode
generiert.
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Dieses Beispiel veranschaulicht den Spezialfall "HTTP/".
// Bessere Alternativen für typische Anwendungsfälle sind
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (um http-Statusmeldungen für Clients, die noch HTTP/1.0 verwenden,
// zu überschreiben)
// 2. http_response_code(404); (um die Standardmeldung zu verwenden)
header("HTTP/1.1 404 Not Found");
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Der zweite Spezialfall ist der "Location:"-Header. Es wird nicht nur
der Header an den Browser geschickt, sondern auch ein
<literal>REDIRECT</literal>-Statuscode (302), wenn nicht bereits der
<literal>201</literal>- oder ein <literal>3xx</literal>-Statuscode
gesendet wurde.
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
header("Location: http://www.example.com/"); /* Browser umleiten */
/* Stellen Sie sicher, dass der nachfolgende Code nicht ausgeführt wird,
wenn eine Umleitung stattfindet. */
exit;
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>replace</parameter></term>
<listitem>
<para>
Der optionale Parameter <parameter>replace</parameter> gibt an, ob der
Header einen vorhergehenden gleichartigen Header ersetzen soll, oder
ob ein zweiter Header des selben Typs hinzugefügt werden soll.
Standardmäßig wird ersetzt; wenn Sie als zweites Argument &false;
übergeben, können Sie so mehrere Header desselben Typs erzwingen. Zum
Beispiel:
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>response_code</parameter></term>
<listitem>
<para>
Forciert einen HTTP-Response-Code des angegebenen Wertes. Dieser
Parameter hat nur einen Effekt, wenn <parameter>header</parameter>
nicht leer ist.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.void;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Wenn der Header nicht gesendet werden kann, gibt <function>header</function>
einen Fehler der Stufe <constant>E_WARNING</constant> aus.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Download-Dialog</title>
<para>
Wollen Sie den Benutzer auffordern, die von Ihnen gesendeten Daten, &zb;
eine generierte PDF-Datei, zu speichern, können Sie den Header
<link xlink:href="&url.rfc;2183">Content-Disposition</link> verwenden, um
einen empfohlenen Dateinamen anzubieten und den Browser zu zwingen, den
Dialog zum Speichern anzuzeigen.
</para>
<programlisting role="php">
<![CDATA[
<?php
// Wir werden eine PDF-Datei ausgeben
header('Content-Type: application/pdf');
// Sie wird downloaded.pdf genannt
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// Die ursprüngliche PDF-Datei heißt original.pdf
readfile('original.pdf');
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Caching-Direktiven</title>
<para>
PHP-Skripte erzeugen oft dynamische Inhalte, die weder vom Browser noch
von irgendeinem Proxy zwischen Web-Server und Client-Browser gepuffert
("gecached") werden sollen bzw. dürfen. Bei vielen Proxies und Browsern
kann das Cachen wie folgt unterbunden werden:
</para>
<programlisting role="php">
<![CDATA[
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
?>
]]>
</programlisting>
<para>
<note>
<para>
Es könnte auch sein, dass Ihre Seiten nicht zwischengespeichert werden,
auch wenn Sie die obigen Header nicht ausgeben. Es gibt eine Reihe von
Optionen, welche die Benutzer in ihrem Browser einstellen können, um
das standardmäßige Caching-Verhalten zu verändern. Durch das Senden
obiger Header sollten Sie jedwede Einstellungen, die die Ausgabe Ihres
Skriptes zwischenspeichern würden, außer Kraft setzen.
</para>
<para>
Weiterhin können Sie <function>session_cache_limiter</function> und die
Konfigurationsoption <literal>session.cache_limiter</literal>
verwenden, um die korrekten Header bezüglich Caching automatisch
generieren zu lassen, wenn Sessions verwendet werden sollen.
</para>
</note>
</para>
</example>
</para>
<para>
<example>
<title>Setzen eines Cookies</title>
<para>
Die Funktion <function>setcookie</function> bietet eine einfache
Möglichkeit, Cookies zu setzen. Um ein Cookie zu setzen, das Attribute
enthält, die <function>setcookie</function> nicht unterstützt, kann die
Funktion <function>header</function> verwendet werden.
</para>
<para>
Im folgenden Beispiel wird ein Cookie mit dem Attribut
<literal>Partitioned</literal> gesetzt.
</para>
<programlisting role="php">
<![CDATA[
<?php
header('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
&note.network.header.sapi;
<note>
<para>
Sie können die Limitierung, dass Header vor jeglicher Ausgabe gesendet
werden müssen, umgehen, indem Sie die Ausgabepufferung verwenden, mit dem
Overhead, dass alle Ausgaben an den Browser auf dem Server gepuffert
werden, bis Sie diese senden. Sie können dies tun, indem Sie in Ihrem
Skript <function>ob_start</function> und <function>ob_end_flush</function>
verwenden, oder indem Sie die Konfigurationsdirektive
<literal>output_buffering</literal> in der &php.ini; bzw. in den
Server-Konfigurationsdateien auf "On" setzen.
</para>
</note>
<note>
<para>
Die HTTP-Status-Headerzeile wird immer die erste zum Client gesendete
sein, egal ob der aktuelle <function>header</function>-Aufruf der erste
ist oder nicht. Der Status kann mittels <function>header</function>
jederzeit mit einer neuen Statuszeile überschrieben werden, sofern die
HTTP-Header noch nicht gesendet wurden.
</para>
</note>
<note>
<para>
Die meisten zeitgemäßen Clients akzeptieren relative
<acronym>URI</acronym>s als Argument für
<link xlink:href="&spec.http1.1;#section-7.1.2">Location:</link>, aber
einige ältere Clients benötigen einen absoluten URI inklusive dem Schema,
Hostnamen und absoluten Pfad. Gewöhnlich können Sie mittels
<varname>$_SERVER['HTTP_HOST']</varname>,
<varname>$_SERVER['PHP_SELF']</varname> und <function>dirname</function>
aus einem relativen Link einen absoluten URI selbst erstellen:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* Weiterleitung auf eine andere Seite im aktuell angeforderten Verzeichnis */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>
]]>
</programlisting>
</informalexample>
</para>
</note>
<note>
<para>
Die Session-ID wird nicht mit dem Location-Header übermittelt, selbst wenn
<link linkend="ini.session.use-trans-sid">session.use_trans_sid</link>
eingeschaltet ist. Sie muss daher manuell durch Verwendung der Konstante
<constant>SID</constant> hinzugefügt werden.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>headers_sent</function></member>
<member><function>setcookie</function></member>
<member><function>http_response_code</function></member>
<member><function>header_remove</function></member>
<member><function>headers_list</function></member>
<member>
Den Abschnitt über
<link linkend="features.http-auth">HTTP-Authentifizierung mit PHP</link>
</member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- 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:"~/.phpdoc/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
-->