Apache: ¿diferencia entre “conjunto de encabezado siempre” y “conjunto de encabezado”?
.htaccess http-headers (1)
Preguntas
- ¿Cuál es la diferencia entre el
Header always set
Header set
y elHeader set
en Apache? - Es decir, ¿qué cambia
always
palabra clave acerca de las circunstancias en las que se establece el encabezado? - ¿Debo siempre establecer mis encabezados usando
always
? - ¿Hay alguna razón para no hacerlo?
Fondo
He visto...
Header always set X-Frame-Options DENY
...tanto como...
Header always set Access-Control-Allow-Headers "*"
... y a veces escucho que la presencia de la palabra clave always
asegura que el encabezado esté correctamente configurado, o que simplemente es mejor incluir la palabra clave always
en general. Sin embargo, nunca he encontrado una respuesta clara y definitiva de por qué ese es el caso.
Ya he revisado los documentos de Apache para los mod_headers
, que solo menciono brevemente always
:
Cuando su acción es una función de un encabezado existente, es posible que deba especificar una condición de siempre, dependiendo de en qué tabla interna se estableció el encabezado original. La tabla que corresponde a siempre se usa para respuestas de error generadas localmente, así como exitosa respuestas Tenga en cuenta también que repetir esta directiva con ambas condiciones tiene sentido en algunos escenarios porque siempre no es un superconjunto de éxito con respecto a los encabezados existentes:
- Está agregando un encabezado a una respuesta no exitosa (no 2xx) generada localmente, como una redirección, en cuyo caso solo la tabla correspondiente a siempre se usa en la respuesta final.
- Está modificando o eliminando un encabezado generado por una secuencia de comandos CGI, en cuyo caso las secuencias de comandos CGI están en la tabla correspondiente a siempre y no en la tabla predeterminada.
- Está modificando o eliminando un encabezado generado por una parte del servidor, pero ese encabezado no se encuentra en la condición de acceso por defecto.
Por lo que puedo decir, esto significa que el Header set always
garantiza que el encabezado esté configurado incluso en páginas que no sean de 200. Sin embargo, mis encabezados HTTP configurados con Conjunto de Header set
siempre parecen aplicarse bien en mis 404 páginas y demás. ¿Estoy malinterpretando algo aquí?
FWIW, he encontrado SO publicaciones como ¿Cuál es la diferencia entre "siempre" y "onsuccess" en la configuración del encabezado de Apache? , pero la única respuesta allí no me lo explicó claramente.
Muchas gracias,
Caleb
¿Cuál es la diferencia entre el conjunto de encabezado y el conjunto de encabezado en Apache?
Como se indica en la parte citada del manual, sin ''siempre'' sus adiciones solo saldrán con respuestas exitosas.
Pero esto también incluye errores de reenvío "exitosos" a través de mod_proxy y quizás otros manejadores similares que actúan aproximadamente como proxies. ¿Qué genera tus 404s que encontraste para estar en desacuerdo con el manual? Un 404 en un archivo local ciertamente se comporta como lo describe el bit citado.
Es decir, ¿qué cambia siempre la palabra clave acerca de las circunstancias en las que se establece el encabezado?
La API de Apache mantiene dos listas asociadas con cada solicitud, encabezados y err_headers. El primero no se usa si el servidor encuentra un error al procesar la solicitud que es el segundo.
¿Debo siempre establecer mis encabezados usando siempre?
Depende de su significado. Digamos que estaba configurando encabezados de Cache-Control que estaban relacionados con lo que esperaba servir para algún recurso. Ahora digamos que en realidad estaba sirviendo algo como un 400 o 502. ¡Es posible que no quiera que se almacene en caché!
¿Hay alguna razón para no hacerlo?
Véase más arriba.
- / -
También hay un bit en el manual que no citó que explica el proxy o CGI de un código de error, pero no para el cual Apache está generando una respuesta de error para:
El argumento de condición opcional determina contra qué tabla interna de encabezados de respuesta operará esta directiva. A pesar del nombre, el valor predeterminado de onsuccess no limita una acción a las respuestas con un código de estado 2xx.
Los encabezados establecidos bajo esta condición todavía se utilizan cuando, por ejemplo, CGI genera una solicitud con éxito, o incluso cuando genera un código de estado defectuoso.