我遇到了一个看似特别的问题,到目前为止我一直无法弄清楚。
我在我们的网站上浏览了一堆静态CSS和JavaScript文件供客户端浏览器使用。我正在使用ColdFusion页面检查Accept-Encoding以确定浏览器是否说它可以膨胀.gz文件。如果不能发送常规.css或.js文件。
在实施此过程后,我在本地和开发环境中都进行了测试,在所有主流浏览器中没有任何问题。但是,仅在我们的生产环境中,Safari和IE似乎无法夸大gzip文件,尽管在我检查Accept-Encoding时可以指示它们。
以下是Safari将文件读取为以下内容的剪辑:
¬ !T common.css }k F ? ,4 # ( 8{ - n% JܖD-IuuY ~ Έ $ Um /p . ̌ |E ;7 z t &gt ; ݮ< = o = r }] a E O 0 Sq \ }m S3j || V - i :ز ũ] yyj D _ ܵ “=y d Ku U ; “[7U] GT; [b将< ? -]z JOAi lPxJbAOx Mն Q Oƛƛ-S ?? Q , S i 8 > G ݫ. (h QO> _wes> / ' u ¬6Nى K F“y ] T1fE ¬ Į>
在所有三台服务器上都是Windows机器,在tomcat上运行ColdFusion 10。我们也在所有服务器上使用IIS 7.5。
经过上周的大量研究,我不再接近解释/解决方案了。
我在网上看到的内容表明“Transfer-Encoding:chunked”可能是个问题。我可以看到它在IE的响应标题中列出(Safari将其列为Transfer-Encoding:Identity),此标题仅在查看生产环境时才出现在那里。
关于Transfer-Encoding,当它不存在时(本地和开发),当“Transfer-Encoding:chunked”存在时,Content-Length标题会出现在它不存在的地方。
此外,我可以确认在IIS中为所有三种环境中的站点启用了静态压缩。 许多人建议通过IIS的ASP部分禁用分块传输编码,虽然我们可以这样做,但我不确定这是不是一个好主意?
我们的生产环境中没有安装ASP,当我们不在ASP中编写任何内容时,我们的系统管理员可以理解安装它(因此它出现在IIS中)。
我还读过关于强制http / 1.0而不是允许http / 1.1的内容,但这似乎是一个警察,而且效率相当低。
但这是我们唯一的选择吗?如果是这样,值得吗?我甚至认为这是正确的时尚吗?我想预编译.gz文件以消除生产服务器上任何不需要的处理。
我不确定我能提供哪些其他信息才能提供帮助,但如果需要,我很乐意为这篇文章提供更多信息。
加载CSS的.cfm示例:
<cfparam name="URL.name" default="" />
<cfif Len( URL['name'] ) GT 0 AND Len( url.name ) LT 64 AND ReFind( url.name, "[^a-zA-Z\-\.\_]+" ) EQ 0>
<cfif CGI['http_accept_encoding'] CONTAINS "gzip" AND FileExists( ExpandPath( './css/' & url.name & '.gz' ) )>
<cfheader name="Content-Encoding" value="gzip" />
<cfcontent reset="true" type="text/css" deletefile="no" file="#ExpandPath('./css/#url.name#.gz')#" />
<cfelseif FileExists( ExpandPath( './css/#url.name#.css' ) )>
<cfcontent reset="true" type="text/css" deletefile="no" file="#ExpandPath('./css/#url.name#.css')#" />
</cfif>
</cfif>
<cfabort>