如何避免 php 调整大小后的图像被 gzip 压缩?

如何避免 php 调整大小后的图像被 gzip 压缩?

我们不应该对图片进行 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”会更短,但无论哪种方式。

相关内容