使用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 2.2 + mod_wsgi部署Django应用程序.我们应该在Apache中启用mod_deflate还是使用Django的GZipMiddleware?哪个选项表现更好?
我遇到一些麻烦阻止mod_deflate跳进这个场景:
问题是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) 我已经按照多个教程中的所有步骤在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.
任何建议都非常欢迎!
要压缩我的所有网页,我使用这个.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) 我有一个客户端/服务器系统,使用通过使用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脚本.
有没有人做过这项工作?我发现这在上传之前对文件进行了压缩,但没有压缩通用请求.
编辑我发现问题实际上是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?
仅供参考: -
我使用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设置的属性.有人有这方面的经验吗?
我终于得到了一个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) 我正在编写一个 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)
我已经验证的内容:
问题:
mod-deflate ×10
apache ×8
php ×3
.htaccess ×2
deflate ×2
gzip ×2
perl ×2
c ×1
deployment ×1
django ×1
http ×1
httpd.conf ×1
lwp ×1
minify ×1
mod-headers ×1
mod-proxy ×1
optimization ×1
yslow ×1
zlib ×1