Cómo especificar el encabezado "Vary: Accept-Encoding" en .htaccess

81

Google PageSpeed ​​dice que debería "Especificar un encabezado Vary: Accept-Encoding" para JS y CSS. ¿Cómo hago esto en .htaccess?

StackOverflowNewbie
fuente
22
No estoy seguro de por qué se cerró, solo porque no involucra un lenguaje de programación no significa que no esté relacionado con la codificación.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Estoy de acuerdo, esto ha sido visto más de 65100 veces, así que creo que es un tema muy buscado sin mencionar que respondo preguntas de htaccess todos los días.
Panama Jack
Sé que esto se mantiene como el infierno, pero el encabezado Vary: Accept-Encodingle dirá al navegador que almacene en caché una versión de la página basada en el Content-Encodingencabezado. Debería ver stackoverflow.com/questions/1975416/… y developers.google.com/speed/docs/best-practices/…
Ismael Miguel
2
@IsmaelMiguel en realidad le dirá al cliente (y más importante, cualquier servidor de almacenamiento en caché en el camino), que el archivo difiere para cada variante del s valor del encabezado de solicitud Accept-Encoding` del cliente , en lugar de cada Content-Encodingvariante del valor del encabezado de respuesta del servidor.
aularon
@ BlueRaja-DannyPflughoeft Porque los usuarios con mucha reputación y los usuarios que buscan reputación construyen reputación buscando preguntas para cerrar. Es frustrante que tan a menudo lleve a cerrarse preguntas que no deberían serlo.
Dan Nissenbaum

Respuestas:

89

Supongo que significa que habilita la compresión gzip para sus archivos css y js, porque eso permitirá al cliente recibir contenido codificado en gzip y contenido simple.

Así es como se hace en apache2:

<IfModule mod_deflate.c>
    #The following line is enough for .js and .css
    AddOutputFilter DEFLATE js css

    #The following line also enables compression by file content type, for the following list of Content-Type:s
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml

    #The following lines are to avoid bugs with some browsers
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
</IfModule>

Y aquí se explica cómo agregar el Vary Accept-Encodingencabezado: [src]

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary: Accept-Encoding
  </FilesMatch>
</IfModule>

El Vary:encabezado le dice que el contenido servido para esta URL variará de acuerdo con el valor de un determinado encabezado de solicitud. Aquí dice que servirá contenido diferente para los clientes que lo digan Accept-Encoding: gzip, deflate(un encabezado de solicitud), que el contenido servido a los clientes que no envían este encabezado. La principal ventaja de esto, AFAIK, es permitir que los proxies de almacenamiento en caché intermedios sepan que deben tener dos versiones diferentes de la misma URL debido a dicho cambio.

aularon
fuente
No creo que esto sea todo. Mi JS y CSS ya están comprimidos. PageSpeed ​​sigue quejándose.
StackOverflowNewbie
3
Creo que se supone que mod_deflate envía el encabezado Vary de forma predeterminada.
Matthew Flaschen
He hecho lo que mencionaste anteriormente. Los archivos .js aún no se comprimen.
Andy N
@Andy; tal vez su servidor no tenga el módulo "mod_deflate.c".
aularon
3
Apache 2.2 no requiere la sección mod_headers en la respuesta anterior. mod_deflate ya hace lo que necesita. httpd.apache.org/docs/2.2/mod/mod_deflate.html
Ari Maniatis
4

Me temo que Aularon no proporcionó suficientes pasos para completar el proceso. Con un poco de prueba y error, pude habilitar Gzipping en mi servidor WHM dedicado.

A continuación se muestran los pasos:

  • Ejecute EasyApache dentro de WHM, seleccione Deflate dentro de la lista Exhaustive Options y reconstruya el servidor.

  • Una vez hecho esto, vaya a Configuración de servicios >> Configuración de Apache >> Incluir editor >> Publicar VirtualHost Incluir, seleccione Todas las versiones, y luego pegue el código mod_headers.cy mod_headers.c (enumerados arriba en la publicación de Aularon) encima de otro dentro del campo de entrada.

  • Una vez guardado, ¡estaba viendo un ahorro de datos del 75,36% en promedio! Puede ejecutar una prueba de antes y después utilizando esta herramienta de compresión HTTP para ver sus propios resultados: http://www.whatsmyip.org/http_compression/

¡Espero que esto funcione para todos ustedes!

  • Mate
Matt D.
fuente
3

¡Para gzip sus archivos de fuentes también!

add "x-font/otf x-font/ttf x-font/eot"

como en:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml x-font/otf x-font/ttf x-font/eot
Tom
fuente
2

Muchas horas dedicadas a aclarar de qué se trataba. Por favor, lea esta publicación para obtener los .HTACCESScódigos avanzados y aprender lo que hacen.

Puedes usar:

Header append Vary "Accept-Encoding"
#or
Header set Vary "Accept-Encoding"
T.Todua
fuente
1

Esto me estaba volviendo loco, pero parece que después de la edición de Aularon faltaban los dos puntos "Vary". Así que cambiar "Vary Accept-Encoding"para "Vary: Accept-Encoding"solucionar el problema por mí.

Habría comentado debajo de la publicación, pero no parece que me lo permita.

De todos modos, espero que esto le ahorre a alguien el mismo problema que yo estaba teniendo.

usuario1473179
fuente
2
¿Estás seguro de que esto marca la diferencia? En los documentos 2.2, ninguno de los ejemplos incluye los dos puntos: httpd.apache.org/docs/2.2/mod/mod_headers.html
Nic Cottrell
1

si alguien necesita esto para el NGINXarchivo de configuración, aquí está el fragmento:

location ~* \.(js|css|xml|gz)$ {
    add_header Vary "Accept-Encoding";
    (... other headers or rules ...)
}
user319730
fuente
0

No es necesario especificar o incluso verificar si el archivo está / se ha comprimido, puede enviarlo a todos los archivos, en cada solicitud.

Le dice a los servidores proxy descendentes cómo hacer coincidir los encabezados de solicitudes futuras para decidir si la respuesta almacenada en caché se puede usar en lugar de solicitar una nueva del servidor de origen.

<ifModule mod_headers.c>
  Header unset Vary
  Header set Vary "Accept-Encoding, X-HTTP-Method-Override, X-Forwarded-For, Remote-Address, X-Real-IP, X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Server"
</ifModule>
  • El unsetobjetivo es corregir algunos errores en el alojamiento GoDaddy anterior, opcionalmente.

fuente