<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.network.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'function.header.php',
    1 => 'header',
    2 => 'Sendet einen HTTP-Header in Rohform',
  ),
  'up' => 
  array (
    0 => 'ref.network.php',
    1 => 'Netzwerk-Funktionen',
  ),
  'prev' => 
  array (
    0 => 'function.getservbyport.php',
    1 => 'getservbyport',
  ),
  'next' => 
  array (
    0 => 'function.header-register-callback.php',
    1 => 'header_register_callback',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/network/functions/header.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.header" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">header</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">header</span> &mdash; <span class="dc-title">Sendet einen HTTP-Header in Rohform</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.header-description">
  <h3 class="title">Beschreibung</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>header</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$header</code></span>, <span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$replace</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span></span>, <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$response_code</code><span class="initializer"> = 0</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>header()</strong></span> wird zum Senden von
   <abbr title="Hypertext Transfer Protocol">HTTP</abbr>-Anfangsinformationen (Headern) im Rohformat
   verwendet. Weitere Informationen über die <abbr title="Hypertext Transfer Protocol">HTTP</abbr>-Header
   finden Sie in der
   <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="link external">&raquo;&nbsp;HTTP/1.1-Spezifikation</a>.
  </p>
  <p class="para">
   Beachten Sie, dass Sie die Funktion <span class="function"><strong>header()</strong></span> 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 <span class="function"><a href="function.include.php" class="function">include</a></span> oder <span class="function"><a href="function.require.php" class="function">require</a></span> oder
   einer anderen Datei-Zugriffsfunktion einlesen, bevor
   <span class="function"><strong>header()</strong></span> aufgerufen wird. Das gleiche Problem kann auch
   auftreten, wenn Sie eine Datei verwenden, in der HTML und PHP vermischt
   wurden.
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;html&gt;<br /><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Dies wird einen Fehler provozieren. Beachten Sie die vorangehende<br /> * Ausgabe, die vor dem Aufruf von header() erzeugt wird */<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Location: http://www.example.com/'</span><span style="color: #007700">);<br />exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.header-parameters">
  <h3 class="title">Parameter-Liste</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">header</code></dt>
     <dd>
      <p class="para">
       Der Header-String.
      </p>
      <p class="para">
       Es gibt zwei Spezialfälle von Header-Aufrufen. Der erste ist ein
       Header, der mit &quot;<code class="literal">HTTP/</code>&quot; 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
       <code class="literal">ErrorDocument</code>-Direktive) zu verwenden, möchten Sie
       bestimmt sicherstellen, dass Ihr Skript den passenden Statuscode
       generiert.
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Dieses Beispiel veranschaulicht den Spezialfall "HTTP/".<br />// Bessere Alternativen für typische Anwendungsfälle sind<br />// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");<br />//    (um http-Statusmeldungen für Clients, die noch HTTP/1.0 verwenden,<br />//    zu überschreiben)<br />// 2. http_response_code(404); (um die Standardmeldung zu verwenden)<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"HTTP/1.1 404 Not Found"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
      <p class="para">
       Der zweite Spezialfall ist der &quot;Location:&quot;-Header. Es wird nicht nur
       der Header an den Browser geschickt, sondern auch ein
       <code class="literal">REDIRECT</code>-Statuscode (302), wenn nicht bereits der
       <code class="literal">201</code>- oder ein <code class="literal">3xx</code>-Statuscode
       gesendet wurde.
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location: http://www.example.com/"</span><span style="color: #007700">); </span><span style="color: #FF8000">/* Browser umleiten */<br /><br />/* Stellen Sie sicher, dass der nachfolgende Code nicht ausgeführt wird,<br />   wenn eine Umleitung stattfindet. */<br /></span><span style="color: #007700">exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
     </dd>
    
    
     <dt><code class="parameter">replace</code></dt>
     <dd>
      <p class="para">
       Der optionale Parameter <code class="parameter">replace</code> 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 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
       übergeben, können Sie so mehrere Header desselben Typs erzwingen. Zum
       Beispiel:
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: Negotiate'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: NTLM'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
     </dd>
    
    
     <dt><code class="parameter">response_code</code></dt>
     <dd>
      <p class="para">
       Forciert einen HTTP-Response-Code des angegebenen Wertes. Dieser
       Parameter hat nur einen Effekt, wenn <code class="parameter">header</code>
       nicht leer ist.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.header-returnvalues">
  <h3 class="title">Rückgabewerte</h3>
  <p class="para">
   Es wird kein Wert zurückgegeben.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-function.header-errors">
  <h3 class="title">Fehler/Exceptions</h3>
  <p class="para">
   Wenn der Header nicht gesendet werden kann, gibt <span class="function"><strong>header()</strong></span>
   einen Fehler der Stufe <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> aus.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.header-examples">
  <h3 class="title">Beispiele</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Download-Dialog</strong></p>
    <div class="example-contents"><p>
     Wollen Sie den Benutzer auffordern, die von Ihnen gesendeten Daten, z. B.
     eine generierte PDF-Datei, zu speichern, können Sie den Header
     <a href="https://datatracker.ietf.org/doc/html/rfc2183" class="link external">&raquo;&nbsp;Content-Disposition</a> verwenden, um
     einen empfohlenen Dateinamen anzubieten und den Browser zu zwingen, den
     Dialog zum Speichern anzuzeigen.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Wir werden eine PDF-Datei ausgeben<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Content-Type: application/pdf'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Sie wird downloaded.pdf genannt<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Content-Disposition: attachment; filename="downloaded.pdf"'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Die ursprüngliche PDF-Datei heißt original.pdf<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">'original.pdf'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Caching-Direktiven</strong></p>
    <div class="example-contents"><p>
     PHP-Skripte erzeugen oft dynamische Inhalte, die weder vom Browser noch
     von irgendeinem Proxy zwischen Web-Server und Client-Browser gepuffert
     (&quot;gecached&quot;) werden sollen bzw. dürfen. Bei vielen Proxies und Browsern
     kann das Cachen wie folgt unterbunden werden:
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Cache-Control: no-cache, must-revalidate"</span><span style="color: #007700">); </span><span style="color: #FF8000">// HTTP/1.1<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Expires: Sat, 26 Jul 1997 05:00:00 GMT"</span><span style="color: #007700">); </span><span style="color: #FF8000">// Datum in der Vergangenheit<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>
     <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
      <p class="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.
      </p>
      <p class="para">
       Weiterhin können Sie <span class="function"><a href="function.session-cache-limiter.php" class="function">session_cache_limiter()</a></span> und die
       Konfigurationsoption <code class="literal">session.cache_limiter</code>
       verwenden, um die korrekten Header bezüglich Caching automatisch
       generieren zu lassen, wenn Sessions verwendet werden sollen.
      </p>
     </p></blockquote>
    </p></div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Setzen eines Cookies</strong></p>
    <div class="example-contents"><p>
     Die Funktion <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> bietet eine einfache
     Möglichkeit, Cookies zu setzen. Um ein Cookie zu setzen, das Attribute
     enthält, die <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> nicht unterstützt, kann die
     Funktion <span class="function"><strong>header()</strong></span> verwendet werden.
    </p></div>
    <div class="example-contents"><p>
     Im folgenden Beispiel wird ein Cookie mit dem Attribut
     <code class="literal">Partitioned</code> gesetzt.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.header-notes">
  <h3 class="title">Anmerkungen</h3>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Header sind nur dann zugänglich und werden nur dann gesendet,
    wenn die genutzte SAPI sie unterstützt.
   </p>
  </p></blockquote>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="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 <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span> und <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>
    verwenden, oder indem Sie die Konfigurationsdirektive
    <code class="literal">output_buffering</code> in der <var class="filename">php.ini</var> bzw. in den
    Server-Konfigurationsdateien auf &quot;On&quot; setzen.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Die HTTP-Status-Headerzeile wird immer die erste zum Client gesendete
    sein, egal ob der aktuelle <span class="function"><strong>header()</strong></span>-Aufruf der erste
    ist oder nicht. Der Status kann mittels <span class="function"><strong>header()</strong></span>
    jederzeit mit einer neuen Statuszeile überschrieben werden, sofern die
    HTTP-Header noch nicht gesendet wurden.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Die meisten zeitgemäßen Clients akzeptieren relative
    <abbr title="Uniform Resource Identifier">URI</abbr>s als Argument für
    <a href="http://tools.ietf.org/html/rfc7231#section-7.1.2" class="link external">&raquo;&nbsp;Location:</a>, aber
    einige ältere Clients benötigen einen absoluten URI inklusive dem Schema,
    Hostnamen und absoluten Pfad. Gewöhnlich können Sie mittels
    <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['HTTP_HOST']</a></var>,
    <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['PHP_SELF']</a></var> und <span class="function"><a href="function.dirname.php" class="function">dirname()</a></span>
    aus einem relativen Link einen absoluten URI selbst erstellen:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Weiterleitung auf eine andere Seite im aktuell angeforderten Verzeichnis */<br /></span><span style="color: #0000BB">$host  </span><span style="color: #007700">= </span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'HTTP_HOST'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$uri   </span><span style="color: #007700">= </span><span style="color: #0000BB">rtrim</span><span style="color: #007700">(</span><span style="color: #0000BB">dirname</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_SELF'</span><span style="color: #007700">]), </span><span style="color: #DD0000">'/\\'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$extra </span><span style="color: #007700">= </span><span style="color: #DD0000">'mypage.php'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location: http://</span><span style="color: #0000BB">$host$uri</span><span style="color: #DD0000">/</span><span style="color: #0000BB">$extra</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br />exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Die Session-ID wird nicht mit dem Location-Header übermittelt, selbst wenn
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
    eingeschaltet ist. Sie muss daher manuell durch Verwendung der Konstante
    <strong><code><a href="session.constants.php#constant.sid">SID</a></code></strong> hinzugefügt werden.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.header-seealso">
  <h3 class="title">Siehe auch</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.headers-sent.php" class="function" rel="rdfs-seeAlso">headers_sent()</a> - Pr&uuml;ft, ob oder wo die Header bereits gesendet wurden</span></li>
    <li><span class="function"><a href="function.setcookie.php" class="function" rel="rdfs-seeAlso">setcookie()</a> - Sendet ein Cookie</span></li>
    <li><span class="function"><a href="function.http-response-code.php" class="function" rel="rdfs-seeAlso">http_response_code()</a> - Get or Set the HTTP response code</span></li>
    <li><span class="function"><a href="function.header-remove.php" class="function" rel="rdfs-seeAlso">header_remove()</a> - Remove previously set headers</span></li>
    <li><span class="function"><a href="function.headers-list.php" class="function" rel="rdfs-seeAlso">headers_list()</a> - Liefert eine Liste der gesendeten (oder zum Senden vorbereiteten) Antwort-Header</span></li>
    <li>
     Den Abschnitt über
     <a href="features.http-auth.php" class="link">HTTP-Authentifizierung mit PHP</a>
    </li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>