<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.header.php',
    1 => 'header',
    2 => 'Env&iacute;a un encabezado HTTP bruto',
  ),
  'up' => 
  array (
    0 => 'ref.network.php',
    1 => 'Funciones de red',
  ),
  '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' => 'es',
    '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">Envía un encabezado HTTP bruto</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.header-description">
  <h3 class="title">Descripción</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> permite especificar el encabezado <abbr title="Hypertext Transfer Protocol">HTTP</abbr>
   <code class="parameter">string</code> al enviar los ficheros HTML.
   Consúltese <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="link external">&raquo;&nbsp;<code class="literal">HTTP/1.1
     Specification</code></a> para obtener más información sobre los encabezados
   <abbr title="Hypertext Transfer Protocol">HTTP</abbr>.
  </p>
  <p class="para">
   Nunca se olvide que <span class="function"><strong>header()</strong></span> debe ser llamada
   antes de que se envíe cualquier contenido, ya sea por líneas HTML habituales en el fichero,
   o por salidas PHP. Un error muy común es leer un fichero con
   <span class="function"><a href="function.include.php" class="function">include</a></span> o
   <span class="function"><a href="function.require.php" class="function">require</a></span>,
   y dejar espacios o líneas vacías, que producirán una salida antes de que la función <span class="function"><strong>header()</strong></span>
   sea llamada. El mismo problema existe con los ficheros
   PHP/HTML estándar.
   <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">/* Esto producirá un error. Observe la salida anterior,<br /> * que se encuentra antes de la llamada a la función header() */<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">Parámetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">header</code></dt>
     <dd>
      <p class="para">
       El encabezado.
      </p>
      <p class="para">
       Existen dos encabezados especiales. El primero comienza con la cadena
       &quot;<code class="literal">HTTP/</code>&quot; (insensible a mayúsculas/minúsculas), que se utiliza
       para indicar el estado HTTP a enviar. Por ejemplo, si se ha configurado
       Apache para utilizar scripts PHP para manejar las peticiones hacia ficheros
       inexistentes (utilizando la directiva <code class="literal">ErrorDocument</code>),
       asegúrese de que el script genere un código de estado correcto.
      </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">// Este ejemplo ilustra el caso especial "HTTP/"<br />// Alternativas mejores en casos típicos de uso incluyen:<br />// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");<br />//    (para sobrescribir mensajes de estado HTTP para clientes que aún usan HTTP/1.0)<br />// 2. http_response_code(404); (para usar el mensaje por defecto)<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">
       El segundo tipo de llamada especial es <code class="literal">&quot;Location:&quot;</code>.
       No solo devuelve un encabezado al cliente, sino que además
       envía un estado <code class="literal">REDIRECT</code> (302) al navegador
       siempre que no se haya enviado un código de estado <code class="literal">201</code> o <code class="literal">3xx</code>.
      </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">/* Redirección del navegador */<br /><br />/* Asegúrese de que el código siguiente no se ejecute una vez realizada la redirección. */<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">
       El argumento opcional <code class="parameter">replace</code> indica
       si la función <span class="function"><strong>header()</strong></span> debe reemplazar
       un encabezado previamente enviado, o bien añadir otro encabezado
       del mismo tipo. Por omisión, un nuevo encabezado sobrescribirá el
       anterior, pero si se pasa <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en este argumento, se pueden
       forzar múltiples encabezados para un mismo tipo de encabezado.
       Por ejemplo:
      </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">
       Fuerza el código de respuesta HTTP al valor especificado. Tenga en cuenta que este
       argumento solo tiene efecto si <code class="parameter">header</code>
       no está vacío.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.header-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   No se retorna ningún valor.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-function.header-errors">
  <h3 class="title">Errores/Excepciones</h3>
  <p class="para">
   Cuando falla el intento de enviar un encabezado,
   <span class="function"><strong>header()</strong></span> genera un error de nivel
   <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.header-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Caja de descarga</strong></p>
    <div class="example-contents"><p>
     Si se desea que los usuarios reciban una alerta para guardar
     los ficheros generados, como si se genera un
     fichero PDF, se puede utilizar el encabezado
     <a href="https://datatracker.ietf.org/doc/html/rfc2183" class="link external">&raquo;&nbsp;Content-Disposition</a> para
     proporcionar un nombre de fichero por defecto, a mostrar en el
     diálogo de guardado.
    </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">// Se desea mostrar un pdf<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">// Será nombrado downloaded.pdf<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">// El origen del PDF 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>Ejemplo #2 Directivas concernientes a la caché</strong></p>
    <div class="example-contents"><p>
     Los scripts PHP generan a menudo HTML dinámico,
     que no debe ser almacenado en caché, ni por el cliente, ni por los
     proxy intermedios. Se puede forzar la desactivación de la
     caché de muchos clientes y proxy con:
    </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">// Fecha en el pasado<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>
     <blockquote class="note"><p><strong class="note">Nota</strong>: 
      <p class="para">
       Puede darse cuenta de que sus páginas nunca son almacenadas en caché incluso si se utilizan todos los encabezados anteriores.
       Existe toda una colección de parámetros que los usuarios pueden modificar en su navegador para cambiar el
       comportamiento por defecto de la caché. Al enviar los encabezados anteriores, se pueden imponer sus propias valores.
      </p>
      <p class="para">
       Además, los parámetros <span class="function"><a href="function.session-cache-limiter.php" class="function">session_cache_limiter()</a></span> y
       <code class="literal">session.cache_limiter</code> pueden ser utilizados para
       generar los encabezados de caché correctos, cuando se utilizan sesiones.
      </p>
     </p></blockquote>
    </p></div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Ejemplo #3 Configurar una cookie</strong></p>
    <div class="example-contents"><p>
     <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> ofrece un medio práctico de configurar cookies.
     Para definir una cookie con atributos no soportados por <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>,
     <span class="function"><strong>header()</strong></span> puede ser utilizado.
    </p></div>
    <div class="example-contents"><p>
     Por ejemplo, el código siguiente define una cookie que incluye un atributo
     <code class="literal">Partitioned</code>.
    </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">Notas</h3>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
 <p class="para">
  Los encabezados solo serán accesibles y se mostrarán cuando se utilice un SAPI que los soporte.
 </p>
</p></blockquote>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Se puede utilizar el sistema de caché (output buffering)
    para evitar este problema. Todo el texto generado será almacenado en buffer en el servidor hasta que se envíe. Se pueden
    utilizar las funciones <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span> y
    <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span> en los scripts, o modificando la directiva de configuración <code class="literal">output_buffering</code>
    en el fichero <var class="filename">php.ini</var> o los ficheros
    de configuración del servidor.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    El código de estado HTTP debe ser siempre el primero en enviarse al cliente,
    en relación con la actual <span class="function"><strong>header()</strong></span> que puede ser el primero
    o no. El estado puede ser sobrescrito llamando a <span class="function"><strong>header()</strong></span>
    con un nuevo estado en cualquier momento, incluso si el encabezado HTTP ya ha sido enviado.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    La mayoría de los clientes modernos aceptan <abbr title="Uniform Resource Identifier">URI</abbr>s relativas como argumento de
    <a href="http://tools.ietf.org/html/rfc7231#section-7.1.2" class="link external">&raquo;&nbsp;Location:</a>,
    pero algunos clientes más antiguos exigen una URI absoluta
    incluyendo el protocolo, el host y la ruta absoluta. Se puede utilizar generalmente las variables globales <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> y <span class="function"><a href="function.dirname.php" class="function">dirname()</a></span> para
    construir una URI absoluta:
    <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">/* Redirección hacia una página diferente del mismo directorio */<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">Nota</strong>: 
   <p class="para">
    El ID de sesión no es pasado con el encabezado Location incluso si
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
    está activado. Debe ser pasado manualmente utilizando la constante
    <strong><code><a href="session.constants.php#constant.sid">SID</a></code></strong>.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.header-seealso">
  <h3 class="title">Ver también</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> - Indica si los encabezados HTTP ya han sido enviados</span></li>
    <li><span class="function"><a href="function.setcookie.php" class="function" rel="rdfs-seeAlso">setcookie()</a> - Env&iacute;a una cookie</span></li>
    <li><span class="function"><a href="function.http-response-code.php" class="function" rel="rdfs-seeAlso">http_response_code()</a> - Obtiene o define el c&oacute;digo de respuesta HTTP</span></li>
    <li><span class="function"><a href="function.header-remove.php" class="function" rel="rdfs-seeAlso">header_remove()</a> - Elimina un encabezado HTTP</span></li>
    <li><span class="function"><a href="function.headers-list.php" class="function" rel="rdfs-seeAlso">headers_list()</a> - Devuelve la lista de los encabezados de respuesta del script actual</span></li>
    <li>
     La sección sobre la'<a href="features.http-auth.php" class="link">autenticación
      HTTP</a>
    </li>
   </ul>
  </p>
 </div>


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