【发布时间】:2013-03-01 09:22:29
【问题描述】:
在我正在开发的嵌入式设备上,网页的 Javascript 向本地 PHP 文件发送请求,然后使用响应动态更新 DOM 元素。一切正常:AJAX 很酷。
不过,令人讨厌的是,所有响应都是 gzip 编码的,尽管我不希望它们不是(目标设备的处理器没有太多的处理带宽)。问题是我看不到如何禁用 gzip 压缩响应。
请注意: (1) 在服务器端,我在Ubuntu下使用PHP 5.3.10和Apache/2.2.22进行测试
(2) 在客户端,我使用的是 Firefox 19.0 和 Firebug
(3) PHP 文件只是在回显它们的输出,即我认为它们没有调用 ob_gzhandler()
(4) JavaScript 使用 GET 而不是 POST(这是为项目指定的)
根据 Firebug,请求标头看起来像这样:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-gb,en;q=0.5
Cookie PHPSESSID=<whatever>
Host 10.0.2.15
Referer http://10.0.2.15/pages/status.php
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0
响应头通常如下所示:-
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Encoding gzip
Content-Length 59
Content-Type text/html
Date Wed, 13 Mar 2013 12:08:02 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=5, max=43
Pragma no-cache
Server Apache/2.2.22 (Ubuntu)
Vary Accept-Encoding
X-Powered-By PHP/5.3.10-1ubuntu3.5
我已经尝试过的方法(但没有任何成功):-
(a) 防止通过本地 .htaccess 文件压缩 php 文件的输出
<IfModule mod_env.c>
SetEnvIfNoCase Request_URI "\.php$" no-gzip dont-vary
</IfModule>
这与http://support.modwest.com/content/1/117/en/how-do-i-turn-off-webservers_-gzip-compression.html 一致,但似乎没有任何效果,即使我在两次调用之间重新启动了 apache2。
(b) 防止通过 /etc/apache2/httpd.conf 文件压缩 php 文件的输出
<Directory /myfolder>
RemoveOutputFilter php
</Directory>
这似乎也没有任何明显的效果,即使我在两次调用之间重新启动了 apache2。
(c) 使用 XMLHttpHeader.setHeaderRequest() 将“Accept-Encoding”标头设置为“”或“identity”
我都试过了
xmlhttp.setRequestHeader("Accept-Encoding", "identity");
...和...
xmlhttp.setRequestHeader("Accept-Encoding", "");
似乎都没有任何明显的效果:Firebug 仍然报告请求标头保留
接受编码 gzip,放气
我检查了这个规范,似乎应该允许 setRequestHeader() 更改 AcceptEncoding 标题行,所以这有点奇怪。可能是一个已被填补的 FF 安全漏洞? http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-setrequestheader
请注意,setRequestHeader() 机制显然工作正常,因为添加...
xmlhttp.setRequestHeader("X-FavouriteFruit", "banana");
...在 Firebug 请求输出中添加一行:
X-FavouriteFruit 香蕉
基本上,我几乎没有想法。我还能如何阻止我的 php 响应被压缩?
【问题讨论】:
-
您应该在 AJAX 请求 中指定是否接受 gz 传输编码作为响应。通常 apache 和 php 都反映了这种愿望。 - 如果这是不可能的,你可以传递一个查询变量,然后让 apache 改变它的行为(和/或删除请求标头,以便 PHP 不认为它也应该压缩)。
-
你是否建议我使用 setRequestHeader() 添加我自己的(比如)“X-Custom-Action”标头,然后在 Apache 注意到 X-Custom-Action 标头时修改其行为应要求?
标签: php javascript firefox xmlhttprequest gzip