mod_gzip mod_deflate enable check addoutputfilterbytype apache http httpd.conf mod-deflate

apache - enable - mod_deflate so



Apache no envía respuestas 304(si mod_deflate y AddOutputFilterByType están habilitados) (4)

He agregado la siguiente línea en mi Apache httpd.conf: -

AddOutputFilterByType DEFLATE text/html text/css application/javascript application/x-javascript application/json

Tengo un archivo html (test.html) con una inclusión de script: -

<script type="text/javascript" src="/test.js"></script>

El problema es que cada vez que cargo test.html, test.js también se carga con el estado HTTP: 200.

La pregunta es: ¿Por qué el GET condicional no está satisfecho?

Si hago un comentario sobre la línea "AddOutputFilterByType" en httpd.conf, Apache envía 304.

Si habilito AddOutputFilterByType en httpd.conf, el encabezado de solicitud es: -

Host: optimize User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729) FirePHP/0.2.4 Accept: */* Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://optimize/ Cookie: PHPSESSID=nbq6h0eeahkshkcbc6ctu2j2b4 If-Modified-Since: Tue, 19 May 2009 07:06:46 GMT If-None-Match: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip Cache-Control: max-age=0

Y el encabezado de respuesta es:

Date: Fri, 22 May 2009 07:03:40 GMT Server: Apache/2.2.9 (Win32) PHP/5.2.6 Last-Modified: Tue, 19 May 2009 07:06:46 GMT Etag: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip Accept-Ranges: bytes Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 52583 Keep-Alive: timeout=5, max=98 Connection: Keep-Alive Content-Type: application/javascript

ACTUALIZACIÓN : Me he dado cuenta, si estoy deshabilitando ETag, funciona correctamente. Quiero decir que envía 304.

FileETag None

Pero realmente quiero mantener ETag tal como está (sé que hay un problema de divulgación de inode).


"También he decidido que los ETags no son tan útiles en Apache de todos modos".

Incorrecto,
por ejemplo, tiene un archivo con la fecha de modificación establecida en ''2016.07.27 05:00:00'' , lo sube a su sitio, el navegador obtiene este archivo con el código HTTP 200, luego lo almacena en caché y lo revalida todo el tiempo con HTTP 304.
A continuación, vuelva a cargar un archivo con el mismo nombre de archivo, pero con una marca ''2013.07.27 05:00:00'' tiempo anterior ''2013.07.27 05:00:00'' y con otro contenido.

Si ETag está deshabilitado en el servidor, el navegador solo usará If-Modified-Since: solicitud para determinar si el archivo fue cambiado en el servidor, por lo que la solicitud será If-Modified-Since: 2016.07.27 05:00:00 , pero el archivo no se modifica después de esta fecha, por lo que se devuelve un HTTP 304, incluso si el archivo ha cambiado.

Si ETag está habilitado en el servidor, además de If-Modified-Since: habrá un encabezado If-None-Match: proviene del navegador que detectará que el archivo fue cambiado (de manera predeterminada - no coincide con la fecha + desajuste de tamaño) y el archivo ser re-descargado


Este problema aún existe en Apache 2.4.23, así que escribí un código mejor que el anterior para solucionar este problema. Expansión línea por línea:

    1) Si el navegador envía una solicitud ''If-None-Match'' que tiene ''-gzip'' al final, configure la variable request_etag = gzip.
    2) Editar encabezado de solicitud para eliminar la parte ''-gzip''.
    3) Edite el encabezado de respuesta para agregar la parte ''-gzip'', pero solo si el navegador envió una solicitud ''-gzip'' inicialmente o si el contenido de la respuesta está codificado gzip.


Puede usar lookahead negativo o lookbehind negativo, la velocidad de regex es la misma, Apache admite ambos

/"(.+(?<!-gzip))/" #using negative lookbehind /"((?:.(?!-gzip/"))+)/" #using negative lookahead

Casos de prueba:

    "2e2-5388f9f70c580-afeg"
    "2e2-5388f9f70c580-gzin"
    "2e2-5388f9f70c580-gzipd"
    "2e2-5388f9f70c580-gzip"
    "2e2-5388f9f70c580gzip"

Copiar y pegar este código en Apache .conf

SetEnvIf If-None-Match "-gzip/"$" request_etag=gzip RequestHeader edit If-None-Match "(.+)-gzip/"$" "$1/"" Header edit ETag "(.+(?<!-gzip))/"$" "$1-gzip/"" "expr=reqenv(''request_etag'') == ''gzip'' || resp(''Content-Encoding'') == ''gzip''"


Yo personalmente uso el siguiente código, que elimina la parte ''-gzip'' inicialmente si es una respuesta gzip, y no la vuelve a agregar, por lo que el navegador nunca enviará un encabezado ''-gzip'' ''If-None-Match'' .

Header edit ETag "(.+)-gzip/"$" "$1/"" "expr=resp(''Content-Encoding'') == ''gzip''"


¿Tal vez utilizas un proxy (chip) que manipula las solicitudes HTTP?


Este es un error conocido en Apache. Ver Apache bug # 45023 , y el resumen de Apache 304 etags y mod_deflate .

Reconstruir desde svn solucionará el problema. La resolución era revertir el cambio que se agregaba "-gzip" al etag. Sin embargo, hay problemas de cumplimiento HTTP asociados.

Si no puede reconstruir Apache, hay una solución alternativa de configuración de tiempo de ejecución sugerida en el informe de errores:

RequestHeader edit "If-None-Match" "^/"(.*)-gzip/"$" "/"$1/"" Header edit "ETag" "^/"(.*[^g][^z][^i][^p])/"$" "/"$1-gzip/""