我们不应该对图片进行 gzip 压缩,对吧?如何避免对图片进行 gzip 压缩,如下所示:img/sample.php?id=image_name.jpg
也可以这样调用img/sample.php?id=image_name.jpg&size=3
实际图片在此处/images/items/
我尝试在 httpd.conf 中使用两种类型的 gzip 配置(见下文),但在两种情况下,图像都会被 gzip 压缩。
图像显然不会被视为常规 .jpg 文件,因为如果是这样,它就不会使用以下任何配置进行 gzip 压缩。然而,实时标头将其显示为常规 image/jpeg
知道如何修复这个问题吗?
第一次尝试:
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>
第二次尝试:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
</IfModule>
答案1
这部分:
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
正在查找图像文件扩展名请求 URI。您的文件扩展名位于请求参数。
很遗憾,mod_setenvif无权访问查询字符串,如果我没有看错文档,那么LocationMatch
。
mod_rewrite但是,确实可以访问查询字符串并可以设置环境变量。
RewriteCond %{QUERY_STRING} \.(?:gif|jpe?g|png)$
RewriteRule ^ - [E=no-gzip,dont-vary]
如果您使用 mod_rewrite,最好使用它来重写 URL,这样它们就根本没有查询字符串了。下面的代码使得上面两行代码变得没有必要。
RewriteRule /generated_images/(.*\.(?:gif|jpe?g|png))$ /sample.php?id=$1
答案2
尝试包括这个:
<LocationMatch \.jpg$>
SetOutputFilter none
</LocationMatch>
答案3
我在 .htaccess 文件中使用它,它很简单:
<FilesMatch "\.(gif|jpg|png|zip|7z|rar|mp3|avi|swf)$">
SetEnv no-gzip 1
SetEnv dont-vary 1
</FilesMatch>
对于通过脚本和查询字符串发送的图像文件,您可以添加以下内容:
RewriteEngine on
RewriteCond %{QUERY_STRING} gif|jpg|png [NC]
RewriteRule ^ - [E=no-gzip,dont-vary]
注意:这些文件区分大小写,因此如果文件名为 IMAGE.JPG,服务器仍会进行干预并对其进行 gzip 压缩。如果需要,请添加大写扩展名。我没有使用“$”,因为您在查询字符串中附加了一个大小变量,因此您需要子字符串搜索,而不是字符串结尾。
此外,最好为处理图像文件的脚本选择一个唯一的名称,如“image.php”,或者在查询字符串中使用唯一的变量来捕获,而不必担心每个图像扩展。
例如RewriteCond %{QUERY_STRING} op=download_image [NC]
RewriteRule ^ - [E=no-gzip,dont-vary]
比如说/sample.php?op=download_image&id=image_name.jpg&size=3
当然,使用请求字符串捕获“image.php”会更短,但无论哪种方式。