2010-12-06 24 views
89

No he encontrado ninguna especificación sobre si la norma permite encabezados de respuesta HTTP duplicados, pero necesito saber si esto causará problemas de compatibilidad.¿Son aceptables los encabezados de respuesta HTTP duplicados?

decir que tengo una cabecera de respuesta como esta:

HTTP/1.1 302 Moved Temporarily 
Server: Apache-Coyote/1.1 
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5 
Cache-Control: no-cache 
Cache-Control: no-store 
Location: http://localhost:9876/foo.bar 
Content-Language: en-US 
Content-Length: 0 
Date: Mon, 06 Dec 2010 21:18:26 GMT 

en cuenta que hay dos cabeceras Cache-Control con diferentes valores. ¿Los navegadores siempre los tratan como si estuvieran escritos como "Cache-Control: no-cache, no-store"?

Gracias.

Su

Respuesta

113

RFC2616 HTTP disponibles here dice:

campos de mensaje de encabezado múltiples con el mismo nombre de campo PUEDE estar presente en un mensaje si y sólo si todo el campo de valor para ese el campo encabezado se define como una lista separada por comas [es decir, # (valores)]. DEBE ser posible combinar los múltiples campos de encabezado en un solo "nombre de campo: valor de campo", sin cambiar la semántica del mensaje , agregando cada valor de campo subsiguiente al primero, cada separados por un coma. El orden en que se reciben campos de cabecera con el mismo nombre de campo tanto, es importante para la interpretación del valor del campo combinado, y por lo tanto un proxy no debe cambiar el orden de estos valores de campo cuando se reenvía un mensaje

Por lo tanto, múltiples encabezados con el mismo nombre están bien (www-authenticate es un caso) si todo el valor de campo se define como una lista de valores separados por comas.

Cache-control se documenta aquí: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 así:

Cache-Control = "Cache-Control" ":" 1#cache-directive 

La sintaxis #1cache-directive define una lista de al menos uno de caché elementos directiva (ver aquí para la definición formal de #values: Notational Conventions and Generic Grammar)

Así que, sí,

Cache-Control: no-cache, no-store 

es equivalente a (el orden es importante)

Cache-Control: no-cache 
Cache-Control: no-store 
+2

Gracias por su pronta respuesta, Simon! ¿Pero el párrafo citado de RFC 2616 no se aplica también al control de caché? ¿Me estoy perdiendo de algo? –

+1

Casi 100% correcto. El control de caché permite múltiples valores: 'Cache-Control =" Cache-Control "": "1 # cache-directive'. Observe el '#' antes de 'cache-directive'. Eso indica que se aceptan varios valores (directamente desde su definición anterior) ... – ircmaxell

+0

Por lo tanto, "Cache-Control: no-cache" + "Cache-Control: no-store" = "Cache-Control: no-cache, no-store "pero ¿y si se repitiera el mismo valor, por ejemplo," Cache-Control: no-cache, no-store "+" Cache-Control: no-cache "=? =" Cache-Control: no-cache, no- store, no-cache "¿o sigue siendo el mismo? – iX3

Cuestiones relacionadas