标签: mod-deflate

Apache httpd 2.4反向代理不压缩

使用Apache httpd 2.2,可以设置反向代理并使用mod_deflate压缩代理内容,以表达Accept-Encoding: gzip标题.

此配置足以使其工作:

    LoadModule deflate_module modules/mod_deflate.so
    LoadModule filter_module modules/mod_filter.so
    SetOutputFilter DEFLATE

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    ProxyRequests Off
    ProxyPass        /tomcat http://localhost:8880/
    ProxyPassReverse /tomcat http://localhost:8880/
    ProxyPass        /other  http://localhost:8001/
    ProxyPassReverse /other  http://localhost:8001/
Run Code Online (Sandbox Code Playgroud)

现在升级到2.4(Windows上为2.4.29)后,接受相同的配置,它确实压缩了DocumentRoot提供的静态内容.但是,当通过ProxyPass检索时,相同的内容将以未压缩的形式返回.

我知道我可以配置Tomcat来进行压缩,但是还有另一个服务器忽略了Accept-Encoding头.

如何设置反向代理,并压缩代理内容?

编辑:

以下是返回的标头,证明代理内容未被2.4服务器压缩:

----- Retrieving uncompressed from DocumentRoot ---------------------------------

C:\Temp>curl -I http://localhost/test.txt 
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache/2.4.29 (Win64) OpenSSL/1.1.0g
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
ETag: "75441-5620701eb471c"
Accept-Ranges: bytes
Content-Length: 480321
Vary: Accept-Encoding
Content-Type: text/plain …
Run Code Online (Sandbox Code Playgroud)

apache mod-deflate mod-proxy

10
推荐指数
1
解决办法
2431
查看次数

mod_deflate vs Django GZipMiddleware,哪一个用于部署?

我们正在使用Apache 2.2 + mod_wsgi部署Django应用程序.我们应该在Apache中启用mod_deflate还是使用Django的GZipMiddleware?哪个选项表现更好?

apache deployment django gzip mod-deflate

9
推荐指数
1
解决办法
1696
查看次数

防止PHP提供的zip文件上的mod_deflate

我遇到一些麻烦阻止mod_deflate跳进这个场景:

  1. 用户运行CodeIgniter(或任何其他重定向index.php的框架)
  2. mod_deflate处于活动状态
  3. zip文件由CodeIgniter控制器提供(头文件+读取文件)

问题是Apache总是将内容检测为正在存在php,因此服务器假定ZIP文件是PHP文件,因此下面的行将不会起作用.

<FilesMatch "\.(xml|txt|html|php)$">
   SetOutputFilter DEFLATE
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

关于我如何让Apache区别于同一index.php框架文件生成的HTML文件或ZIP文件的任何想法.

编辑:
apache日志

[Mon Jun 20 02:14:19 2011] [debug] 
mod_deflate.c(602): [client 192.168.0.5] 
Zlib: Compressed 50870209 to 50878224 : URL /index.php, 
referer: http://demo.dev/
Run Code Online (Sandbox Code Playgroud)

编辑:
提供zip的CI控制器

header('Content-Type: application/zip');
header('Content-Transfer-Encoding: binary');
header("Content-Length: " . filesize($file_location)); 
header('Content-Disposition: attachment; filename="' . $file_title . '"'); 
readfile($file_location);
Run Code Online (Sandbox Code Playgroud)

php apache mod-deflate

8
推荐指数
1
解决办法
4411
查看次数

Apache mod_deflate不压缩json输出

我已经按照多个教程中的所有步骤在Apache中启用mod_deflate但是当我向本地Web服务器发出json(通过PHP脚本)请求时,我仍然没有看到压缩(在Fiddler中).我的浏览器不需要压缩到localhost,但我的机器会定期通过慢速VPN暴露,所以我想使用它.

来自httpd.conf:

LoadModule deflate_module modules/mod_deflate.so (没有注释掉)

mod_deflate.so存在于Apache2/modules中

PHP脚本在运行时立即设置以下标头: header('Content-Type: application/json');

application/json 存在于Apache2/conf/mime.types中

这是httpd.conf中关于应该压缩的mime类型的相关部分:

Alias /mapguide "C:/Program Files/OSGeo/MapGuide/Web/www/"
<Directory "C:/Program Files/OSGeo/MapGuide/Web/www/">
  AllowOverride All
  Options All -Indexes
  Order allow,deny
  Allow from all

...

  # Content compression
  AddType text/javascript js jgz
  AddOutputFilterByType DEFLATE text/javascript application/json text/html

  RewriteEngine on
  RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</Directory>
Run Code Online (Sandbox Code Playgroud)

当我向服务器发出请求时,请求标头包括Accept-Encoding: gzip, deflate,但响应未经压缩返回.每次.conf更改后我都重启了Apache.

任何建议都非常欢迎!

php apache mod-deflate deflate httpd.conf

7
推荐指数
1
解决办法
9322
查看次数

我可以告诉mod_deflate和PHP只跳过一个目录上的压缩吗?

要压缩我的所有网页,我使用这个.htaccess代码.deflate如果可能,它使用Apache 模块,否则应用PHP ob_gzhandler压缩.

一切正常,但由于特定原因,我不想对文件夹应用压缩./folderWithoutCompression.

问题:如果在下面的脚本中deflate定义了Apache 模块(PHP ob_gzhandler案例),我该如何添加此异常?

<IfModule mod_deflate.c>
  # force deflate for mangled headers
  # developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  <IfModule mod_setenvif.c>
    <IfModule mod_headers.c>
      SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
      RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
    </IfModule>
  </IfModule>

  # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
  <IfModule filter_module>
    FilterDeclare   COMPRESS
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
    FilterProvider  COMPRESS …
Run Code Online (Sandbox Code Playgroud)

php apache .htaccess mod-deflate

7
推荐指数
1
解决办法
4420
查看次数

使用LWP,Apache和mod_deflate压缩HTTP请求

我有一个客户端/服务器系统,使用通过使用Perl的LWP的客户端使用HTTP请求和响应传输的XML以及通过Apache运行Perl的CGI.pm的服务器来执行通信.此外,流使用SSL加密,并为服务器和所有客户端提供证书.

该系统运行良好,但客户端需要定期发送大量数据.一个明显的解决方案是压缩客户端上的数据,将其发送出去,然后在服务器上解压缩.而不是这样的实现我自己,我希望能使用Apache的mod_deflate模块的"输入减压"描述这里.

描述警告:

如果您自己评估请求正文,请不要相信Content-Length标头!Content-Length标头反映了来自客户端的传入数据的长度,而不是解压缩数据流的字节数.

因此,如果我提供与压缩数据大小匹配的Content-Length值,则会截断数据.这是因为mod_deflate解压缩了流,但CGI.pm只读取Content-Length限制.

或者,如果我试图超越它并用解压缩的数据大小覆盖Content-Length标头,LWP会抱怨并将值重置为压缩长度,从而给我留下同样的问题.

最后,我试图破解LWP中进行修正的部分.原始代码是:

    # Set (or override) Content-Length header
    my $clen = $request_headers->header('Content-Length');
    if (defined($$content_ref) && length($$content_ref)) {
        $has_content = length($$content_ref);
        if (!defined($clen) || $clen ne $has_content) {
            if (defined $clen) {
                warn "Content-Length header value was wrong, fixed";
                hlist_remove(\@h, 'Content-Length');
            }
            push(@h, 'Content-Length' => $has_content);
        }
    }
    elsif ($clen) {
        warn "Content-Length set when there is no content, fixed";
        hlist_remove(\@h, 'Content-Length');
    }
Run Code Online (Sandbox Code Playgroud)

我把推线改为:

  push(@h, 'Content-Length' => $clen);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致一些问题,即内容(截断或不截断)甚至无法访问我的CGI脚本.

有没有人做过这项工作?我发现在上传之前对文件进行了压缩,但没有压缩通用请求.

apache perl mod-deflate lwp

6
推荐指数
1
解决办法
2421
查看次数

启用mod_deflate以发送Content-Encoding:gzip

编辑我发现问题实际上是php缩小.这是发送泄露的内容而不是Apache.我会在此发现更多.

根据高性能网站,如果我在Apache 2.x中启用mod_deflate,通过添加以下行,它应该发送gzipped/delfated内容: -

AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
Run Code Online (Sandbox Code Playgroud)

该书还说,这gzip比更有效deflate.

我通过添加相同的行在httpd.conf中启用.但Apache发送Content-Encoding: deflate.

我使用CURL测试: -

curl -i -H "Accept-Encoding: gzip" "http://192.168.1.33/s.js" >> e:\curl_log.txt
Run Code Online (Sandbox Code Playgroud)

它返回'gzipped'内容.但是当我发送命令时: -

curl -i -H "Accept-Encoding: gzip, deflate" "http://192.168.1.33/s.js" >> e:\curl_log.txt
Run Code Online (Sandbox Code Playgroud)

它返回'放气'的内容.

因此,如果浏览器同时支持deflated和gzip,则Apache发送缩减.如何告诉Apache更喜欢gzip而不是deflate?

仅供参考: -

apache mod-deflate deflate

6
推荐指数
1
解决办法
1万
查看次数

结合放气和缩小 - 我创造了开销吗?

我使用google.codes minify来动态缩小我的css和js文件.我还设置了我的.htaccess在我的所有css和js文件上使用deflate - 这是因为某些js文件(如shadowbox和tinymce)引用了代码中的其他js文件.所以我用apache deflate进行压缩,并用gzip缩小压缩一些js和css文件 - 我通过这样做创建开销 - 首先gzipping(minify)然后zlib(deflate)将再次运行.或者apache deflate忽略已经gzip压缩的文件,这些文件在头文件中具有minify设置的属性.有人有这方面的经验吗?

gzip zlib mod-deflate minify

6
推荐指数
1
解决办法
1656
查看次数

Mod_deflate和mod_header设置?

我终于得到了一个VPS主机帐户设置,这允许我使用mod_deflate和mod_header(当然).我试图通过YSlow的指导方针使我的网站更快,其中包括gzipping(通过mod_deflate)页面和设置一个长期过期标题.

这个.htaccess代码会是什么样的?我已经看过各种例子,但我想知道适合这些参数会是什么样子.

例如

# Mod_deflate
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|iso|tar|bz2|sit|rar|png|jpg|gif|jpeg|flv|swf)$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.[0678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent env=!dont-vary
</IfModule>
Run Code Online (Sandbox Code Playgroud)

optimization .htaccess mod-deflate yslow mod-headers

6
推荐指数
1
解决办法
2万
查看次数

在 Apache 输出过滤器中使用响应标头

我正在编写一个 apache 模块输出过滤器,它需要消耗几个仅供内部使用的响应标头。这些响应标头由在后端运行的基于perl的应用程序设置。我在输出过滤器中使用的 APR 函数是:

apr_table_get(r->headers_out, "x-my-response-header");
Run Code Online (Sandbox Code Playgroud)

然而,似乎发生的情况是,在我的输出过滤器中,我没有看到上述响应标头集,直到第三或第四桶旅 - 不幸的是已经太晚了 - 我实际上需要使用 x-my- 的值response-header 计算新的响应标头并将设置在对浏览器的响应中。

我这样插入输出过滤器:

ap_hook_insert_filter(insertOutputFilterHook, NULL, NULL, APR_HOOK_FIRST);
ap_register_output_filter(myFiltersName, myOutputFilter, NULL, AP_FTYPE_CONTENT_SET);
Run Code Online (Sandbox Code Playgroud)

我已经验证的内容:

  • 仅供内部使用的标头确实出现在我的浏览器上的 HTTP 响应中(尚未取消设置)
  • 前两个桶队的桶包含html页面文本

问题:

  • 在第一次调用我的输出过滤器/第一个存储桶旅时,仅内部响应标头未设置/不可见的原因可能是什么?
  • 是否可以先累积前几个桶组,然后在知道内部唯一响应标头的值后开始将它们清除?

c apache perl http mod-deflate

6
推荐指数
0
解决办法
393
查看次数