<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>简单生活 —— Kevin Yang的博客 &#187; HTTP</title> <atom:link href="http://www.imkevinyang.com/tags/http/feed" rel="self" type="application/rss+xml" /><link>http://www.imkevinyang.com</link> <description>It&#039;s all about sharing</description> <lastBuildDate>Thu, 29 Jul 2010 17:50:43 +0000</lastBuildDate> <generator>http://wordpress.org/?v=2.9.1</generator> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>当Google Analytics、Firefox和IIS走到了一起&#8230;</title><link>http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html</link> <comments>http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html#comments</comments> <pubDate>Sat, 29 May 2010 10:25:09 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[疑难杂症]]></category> <category><![CDATA[Bad Request]]></category> <category><![CDATA[Cookie]]></category> <category><![CDATA[Fiddler]]></category> <category><![CDATA[Firefox]]></category> <category><![CDATA[Google Analytics]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[IE]]></category> <category><![CDATA[IIS]]></category> <category><![CDATA[WFetch]]></category> <category><![CDATA[中文]]></category> <category><![CDATA[非法请求]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html</guid> <description><![CDATA[<p>今天同事在投放AdWords广告的时候发现了一个诡异的现象：</p><blockquote><p>使用Firefox点击AdWords广告跳转到客户网站上之后，再次刷新页面或者浏览其他页面均提示“Bad Request”的HTTP错误（错误码400）。</p><p>而IE、Chrome下则没有这个问题。</p></blockquote><h2>Cookie惹的祸</h2><p>由于HTTP本身是无状态的，用来实现状态维持的技术一般都是Cookie。而之前我也遇到过几次因为Cookie导致的访问异常。一次是同事用Firefox死活访问不了新东方网站&#8230;</p>]]></description> <content:encoded><![CDATA[<p>今天同事在投放AdWords广告的时候发现了一个诡异的现象：</p><blockquote><p>使用Firefox点击AdWords广告跳转到客户网站上之后，再次刷新页面或者浏览其他页面均提示“Bad Request”的HTTP错误（错误码400）。</p><p>而IE、Chrome下则没有这个问题。</p></blockquote><h2>Cookie惹的祸</h2><p>由于HTTP本身是无状态的，用来实现状态维持的技术一般都是Cookie。而之前我也遇到过几次因为Cookie导致的访问异常。一次是同事用Firefox死活访问不了新东方网站（参见我之前的文章：<a href="http://www.imkevinyang.com/2009/07/firefox%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E7%89%B9%E5%AE%9A%E7%BD%91%E7%AB%99.html">Firefox无法访问特定网站</a>），一次是我自己死活登录不了Gmail帐号。这两个问题最终都是以清空Cookie解决的。所以这次有经验了，用web developer bar查看当前客户网站下都有哪些Cookie，一瞄，发现一个带乱码的Cookie。</p><p><img style="display: inline; border-width: 0px;" title="GA的乱码Cookie" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image12.png" border="0" alt="GA的乱码Cookie" width="344" height="33" /></p><p>不用想，也知道这是因为中文没有编码就直接塞到Cookie里头导致的乱码。看看Cookie的来头，__utmz，是Google Analytics（GA）植入的。删除此Cookie之后，访问正常。</p><h2>Google Analytics的Cookie编码问题</h2><p>同事测试的那个广告的Url添加了Google Analytics支持的跟踪参数，并且客户网站上也部署了GA的代码。</p><p>GA在执行时会检测当前Url中是否包含广告跟踪参数（至少必须包含utm_source），一旦发现，则认为是付费流量，这个时候它就会提取广告信息中的来源（utm_source），广告系列（utm_campaign）和广告媒介（utm_medium），对其进行解码（先尝试用decodeURIComponent函数，失败的话再用unescape函数），最后持久化存储到__utmz这个Cookie中。但是就在<strong><span style="color: #008000;">写入Cookie这一步，GA漏掉了编码操作</span></strong>。也就是说，如果我们的广告系列或者广告媒介的原始信息包含中文，那么GA就会直接往Cookie中塞入中文信息。</p><p>举个例子，我要为我的博客投一个宣传广告：</p><ul><li>广告系列：Kevin博客宣传</li><li>广告来源：google</li><li>广告媒介：PPC</li><li>带跟踪参数的着陆页面Url：<a href="http://www.imkevinyang.com/?utm_source=google&amp;utm_medium=ppc&amp;utm_campaign=Kevin%E5%8D%9A%E5%AE%A2%E5%AE%A3%E4%BC%A0">http://www.imkevinyang.com/?utm_source=google&amp;utm_medium=ppc&amp;utm_campaign=Kevin%E5%8D%9A%E5%AE%A2%E5%AE%A3%E4%BC%A0</a></li></ul><p>那么GA在写Cookie的时候，会执行类似下面的代码（当然这里简化了__utmz的值）：</p><pre class="brush: js">var data = "Kevin博客宣传";
// GA错误的Cookie操作
document.cookie = "_utmz=" + data;
// 正确的Cookie存储操作
document.cookie = "_utmz=" + encodeURI(data);</pre><p>使用Javascript对Cookie进行存取，标准的操作应该是在存入的时候编一次码，取出的时候解一次码。这样保证存放在Cookie中的都是ASCII字符。早期JS使用escape/unescape进行编解码，现在通常使用encodeURI或者encodeURIComponent函数，这两个函数用的都是UTF-8编码。</p><h2>中文Cookie潜在的问题</h2><p>那么当我们直接将中文直接存到Cookie又会发生了什么事呢？IE和Firefox的行为有什么不一样的地方呢？我们在IE8和Firefox3.6下做几个实验。</p><h3>IE8对中文Cookie的处理</h3><p>实验步骤：</p><ul><li>打开IE8，清空所有Cookie和缓存，建立干净的测试环境。</li><li>访问<a href="http://www.imkevinyang.com/">http://www.imkevinyang.com/</a></li><li>地址栏执行javascript:alert(document.cookie="mycookie=缂栫爜编码;expires=Mon, 25 May 2020 10:31:49 GMT")，写入一个持久化cookie。</li></ul><p>这样就在我的博客上设置了一个2020年5月25号过期的cookie了。之所以要设置持久化cookie而不是会话Cookie，是因为IE会将持久化Cookie写入到硬盘上了，这样方便我们了解这个过程，而会话cookie我目前还不清楚他存储的位置。</p><p>细心的你会注意到，上面这个cookie的值很奇怪，有几个乱码。其实那段乱码是我把“编码”这两个汉字的UTF-8编码（6个字节）使用GB2312解码（每两个字节对应一个字符）后得到的字符。至于为什么要这样测试，一会我们就会知道了。</p><p>IE地址栏用的是ANSI编码，也就是说当你在地址栏输入中文的时候，IE会将中文字符以系统默认字符集进行编码。当你使用中文系统时，地址栏的“编码”字符，实际上最后会被编码为B1 E0 C2 EB四个字节，而在英文系统下，系统使用的是西方字符集作为默认字符集，没有中文字符，因此“编码”这两个字符会被替换成?，也就是3F。</p><p>IE在创建cookie文件，会自动选择最合适的编码。当我们写入“缂栫爜编码”（GB2312编码后得到二进制流E7 BC 96 E7 A0 81 B1 E0 C2 EB），由于最后四个字节无法用UTF-8解码，因此IE会将文件存储为GB2312。（如果你只测试“缂栫爜”的话，IE会将文件存储为UTF-8）。</p><p>好了，现在让我们来看看文件里头都是什么内容。</p><p>打开everything工具，搜索“www.imkevinyang txt”这样就会列出文件名包含<a href="http://www.imkevinyang">www.imkevinyang</a>和txt的所有文件。</p><p><img style="display: inline; border-width: 0px;" title="Everything快速搜索" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image13.png" border="0" alt="Everything快速搜索" width="158" height="84" /></p><p>打开这个文件，里头存放的就是IE持久化的cookie信息。</p><p><img style="display: inline; border-width: 0px;" title="IE存储持久化Cookie的文件" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image14.png" border="0" alt="IE存储持久化Cookie的文件" width="144" height="164" /> <img style="display: inline; border-width: 0px;" title="IE存储持久化Cookie的文件——二进制形式" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image15.png" border="0" alt="IE存储持久化Cookie的文件——二进制形式" width="406" height="105" /></p><p>这个时候，我们再在地址栏通过javascript:alert(document.cookie)我们会发现，IE显示的Cookie值和我们一开始设置的是一样的。</p><p>看完了本地的Cookie信息，我们接下来看看IE发送给服务器的Cookie又是什么。</p><p>我们用Fiddler来监视整个HTTP通讯过程（这里不用HTTP Watch是因为HTTP Watch会将HTTP消息解码后显示出来，没办法看到原始二进制数据，不方便分析）。</p><p>我们再向我的博客首页发起一次访问，在Fiddler中我们会看到：</p><p>（文本形式）</p><p><img style="display: inline; border-width: 0px;" title="Fiddler观察发送中文Cookie（文本形式）" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image16.png" border="0" alt="Fiddler观察发送中文Cookie（文本形式）" width="477" height="185" /></p><p>（二进制原始数据）</p><p><img style="display: inline; border-width: 0px;" title="Fiddler观察发送中文Cookie（二进制形式）" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image17.png" border="0" alt="Fiddler观察发送中文Cookie（二进制形式）" width="474" height="198" /></p><p>我们很惊奇的看到，IE发送的并不是我们设置的那些字符“缂栫爜编码”（二进制是E7 BC 96 E7 A0 81 B1 E0 C2 EB），而是“编码����”（现在知道我为什么要用“缂栫爜编码”做测试了把）。对应的二进制是E7 BC 96 E7 A0 81 EF BF BD EF BF BD EF BF BD EF BF BD。注意到，IE将原始信息的后面4个字节替换成了EF BF BD.</p><p>这是因为IE发送HTTP消息的时候会检测字节流是否是能够以UTF-8解码，如果不行，那么会将相应的异常字节替换成EF BF BD（也就是对应�字符）。这有点类似于我们之前提到的，英文系统对于缺失的字符会使用?号替代。</p><h3>Firefox对于中文Cookie的处理</h3><p>Firefox不像IE那样把Cookie直接存储为文件的形式，所以我们研究起来没那么方便。</p><p>不过我们还是按照上面同样的步骤来做实验，不过这次为了简单起见我们修改一下测试的Cookie值。</p><ul><li>打开Firefox，清空所有Cookie和缓存，建立干净的测试环境。</li><li>访问<a href="http://www.imkevinyang.com/">http://www.imkevinyang.com/</a></li><li>地址栏执行javascript:alert(document.cookie="mycookie=1编码1")</li></ul><ul>第一次Firefox弹出的对话框显示我们Cookie应该是设置成功了，返回“1编码1”字符串。</ul><p><img style="display: inline; border: 0px;" title="Firefox设置Cookie" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image18.png" border="0" alt="Firefox设置Cookie" width="297" height="138" /></p><p>但如果你再次通过Javascript:alert(document.cookie)你会发现，这次弹出的内容变了：</p><p><img style="display: inline; border: 0px;" title="Firefox显示乱码的Cookie" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image19.png" border="0" alt="Firefox显示乱码的Cookie" width="325" height="117" /></p><p>我们通过Web Developer Toolbar查看当前域下的Cookie，发现，目前的Cookie确实是像上面第二个对话框所示的，是带乱码的：</p><p><img style="display: inline; border: 0px;" title="Web Developer Bar看到的乱码的Cookie" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image20.png" border="0" alt="Web Developer Bar看到的乱码的Cookie" width="222" height="188" /></p><p>我们现在关心的问题是，这个乱码是怎么来的？</p><p>我们先把这串文字拷贝到Notepad++中（注意，需要将Notepad++调到UCS-2编码状态下）看一下对应的字节是什么。</p><p><img style="display: inline; border: 0px;" title="乱码cookie的二进制" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image21.png" border="0" alt="乱码cookie的二进制" width="239" height="41" /></p><p>31是字符“1”的ASCII码。而16和01是哪来的呢？</p><p>其实是Unicode Code Point。“编码”的Unicode码是“7F16 7801”。上面显示的16和01就是截断了Unicode码高位得到的。为了证实这个结论，我又测试了好几个中文cookie，均是如此。</p><p>也就是说，Firefox的地址栏使用的是Unicode码，也就是说当你输入“mycookie=1编码1”这样的字符串的时候，Firefox看到的是：</p><p>\u006d\u0079\u0063\u006f\u006f\u006b\u0069\u0065\u003d\u0031\u7f16\u7801\u0031</p><p>在存储中文Cookie的时候，他会将Unicode的高位截断，保留低位。然后写入Cookie存储。这也是为什么我们会看到“编码”这个Cookie变成了“16 01”。</p><p>Firefox向服务端发送HTTP请求时对于http消息的编码处理方式和IE的一样，也是判断字节流能够以UTF-8进行解码，这里就不再赘述了。有兴趣的朋友可以按照上面的方法去测试。</p><h2>为什么Firefox无法访问</h2><p>基于上面对IE和Firefox对中文Cookie的处理方式的了解，我们现在可以知道，对于中文Cookie，IE是用ANSI编码，也就是说Cookie中永远不会出现ASCII字符集中的不可打印字符（GB2312编码每个字节也都是从A0开始的），而Firefox采用Unicode码，却又对其进行了高位截断，导致Cookie有可能会出现ASCII字符集中的非打印字符。</p><p>IE和Firefox在构造HTTP消息的时候对于字节流序列编码问题的处理方式一样。无法使用UTF-8解码的字节流序列，将其替换成EF BF BD，这个我们在Fiddler中已经看到了。而对于ASCII字符集的非打印字符则不做任何处理，直接发送到服务器端。</p><p>所以用Firefox访问，服务端收到的HTTP Request有可能包含非打印字符，而IE访问的话，则不会出现这样的情况。</p><p>例如Firefox上设置了一个中文Cookie，“我”，Unicode码是62 11，被Firefox高位截断了，就剩下11了，对应着ASCII码表中的Device Control 1，也就是控制字符。那么当你带着这个Cookie向服务端发起请求的时候服务端有可能就会直接抛出Bad Request的异常，告诉客户端，你发过来的请求不符合HTTP规范。</p><p>所以实际上不只是Cookie不能出现这样的非打印字符，其他HTTP Header中也不能出现这样的非打印字符。我们可以直接使用WFetch来构造这样的“非法”请求：</p><p><img style="display: inline; border: 0px;" title="Wfetch发送异常请求" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image22.png" border="0" alt="Wfetch发送异常请求" width="177" height="183" /> <img style="display: inline; border: 0px;" title="UserAgent中包含非打印字符" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image23.png" border="0" alt="UserAgent中包含非打印字符" width="283" height="164" /></p><p>服务端一样会抛出400 Bad Request。</p><h2>IIS和Apache的不同处理方式</h2><p>当客户端发起的请求存在问题时，服务端的处理方式是取决于不同服务器的实现的。我们上面讨论的这个问题，实际上只会对IIS造成影响，对那些后台采用Apache或者LiteSpeed这类的服务器不会有影响。这说明IIS的容错性还是稍微差一点，不知道从安全的角度来考虑是好事还是坏事。</p><h2>总结回顾</h2><p>上面讲了那么多，你可能听着有点乱了。我们重新来整理一遍整个故事。</p><blockquote><p>广告代理商投了一个广告，着陆页面Url中添加了google的广告参数，其中带有中文信息，客户网站上部署了GA代码，GA读取到此中文信息之后直接扔到Cookie中而没有经过编码。Firefox内部将此中文的Unicode码高位截断保留低位存下来。当你再次刷新页面的时候，Firefox把这个截断的字符发给IIS服务器，而刚好这个截断之后的字符是一个非打印字符，IIS觉得自己无法处理，就抛出一个Bad Request，告诉客户端此请求非法，我无法处理。</p></blockquote><p>整个故事就这样。</p><p>怎么办呢？建议为了保险起见，如果客户网站服务器用的是IIS，那么你还是不要在Firefox上投放那些Url跟踪参数带中文（即使是UTF-8编码过）的广告了，否则可能浪费钱，因为用户来了，再点一次可能就无法访问了，而且以后可能都无法访问了（现在终于知道为什么我那同事当时用Firefox始终访问不了新东方了...）。(<span style="color: #ff0000;">update:2010-7-2</span>)或者你在投放广告的时候，Url参数中的广告系列、广告媒介以及广告来源这三个跟踪参数不要包含中文信息（即使是UTF-8编码过的），全部使用英文，这样也不会有问题。</p><p>希望整个分析过程对你有所帮助。</p><p style="text-align: right;">——<a title="当Google Analytics、Firefox和IIS走到了一起..." href="http://www.imkevinyang.com/2010/05/%e5%bd%93Google%20Analytics%e3%80%81Firefox%e5%92%8cIIS%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7....html"><em><strong>Kevin Yang</strong></em></a></p>标签：<a href="http://www.imkevinyang.com/tags/bad-request" title="Bad Request" rel="tag">Bad Request</a>, <a href="http://www.imkevinyang.com/tags/cookie" title="Cookie" rel="tag">Cookie</a>, <a href="http://www.imkevinyang.com/tags/fiddler" title="Fiddler" rel="tag">Fiddler</a>, <a href="http://www.imkevinyang.com/tags/firefox" title="Firefox" rel="tag">Firefox</a>, <a href="http://www.imkevinyang.com/tags/google-analytics" title="Google Analytics" rel="tag">Google Analytics</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/ie" title="IE" rel="tag">IE</a>, <a href="http://www.imkevinyang.com/tags/iis" title="IIS" rel="tag">IIS</a>, <a href="http://www.imkevinyang.com/tags/wfetch" title="WFetch" rel="tag">WFetch</a>, <a href="http://www.imkevinyang.com/tags/%e4%b8%ad%e6%96%87" title="中文" rel="tag">中文</a>, <a href="http://www.imkevinyang.com/categories/techarticles/knottyproblems" title="疑难杂症" rel="tag">疑难杂症</a>, <a href="http://www.imkevinyang.com/tags/%e9%9d%9e%e6%b3%95%e8%af%b7%e6%b1%82" title="非法请求" rel="tag">非法请求</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> (2010/05/05)</li><li><a href="http://www.imkevinyang.com/2010/01/document-referrer%e4%b8%a2%e5%a4%b1%e7%9a%84%e5%87%a0%e4%b8%aa%e5%8e%9f%e5%9b%a0.html" title="Document.Referrer丢失的几个原因 (2010/01/18)">Document.Referrer丢失的几个原因</a> (2010/01/18)</li><li><a href="http://www.imkevinyang.com/2009/07/firefox%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae%e7%89%b9%e5%ae%9a%e7%bd%91%e7%ab%99.html" title="Firefox无法访问特定网站 (2009/07/02)">Firefox无法访问特定网站</a> (2009/07/02)</li><li><a href="http://www.imkevinyang.com/2010/01/google-analytics%e4%b8%ad%e7%9a%84page%e7%bb%b4%e5%ba%a6.html" title="Google Analytics中的Page维度 (2010/01/04)">Google Analytics中的Page维度</a> (2010/01/04)</li><li><a href="http://www.imkevinyang.com/2009/03/ie%e4%b8%ad%e4%bd%bf%e7%94%a8windowopen%e6%89%93%e5%bc%80%e6%96%b0%e7%aa%97%e5%8f%a3%e6%97%b6%e6%97%a0%e6%b3%95%e8%8e%b7%e5%8f%96referrer%e5%af%b9%e8%b1%a1.html" title="IE中使用window.open打开新窗口时无法获取Referrer对象 (2009/03/07)">IE中使用window.open打开新窗口时无法获取Referrer对象</a> (2009/03/07)</li><li><a href="http://www.imkevinyang.com/2009/06/javascript%e6%93%8d%e7%ba%b5cookie.html" title="Javascript操纵Cookie (2009/06/11)">Javascript操纵Cookie</a> (2009/06/11)</li><li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> (2010/02/13)</li><li><a href="http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html" title="【推荐】两款HTTP流量分析工具的比较 (2009/11/08)">【推荐】两款HTTP流量分析工具的比较</a> (2009/11/08)</li><li><a href="http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html" title="使用相对Url无缝切换HTTP-HTTPS (2009/09/18)">使用相对Url无缝切换HTTP-HTTPS</a> (2009/09/18)</li><li><a href="http://www.imkevinyang.com/2010/02/%e5%bd%93%e5%89%8d%e6%97%a5%e6%9c%9f110%e5%b9%b4.html" title="当前日期110年 (2010/02/12)">当前日期110年</a> (2010/02/12)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html/feed</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>64位系统下IIS7 ISAPI处理器加载失败</title><link>http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html</link> <comments>http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html#comments</comments> <pubDate>Tue, 04 May 2010 16:01:18 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[疑难杂症]]></category> <category><![CDATA[Analysis Services]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[IIS]]></category> <category><![CDATA[IIS7]]></category> <category><![CDATA[ISAPI]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html</guid> <description><![CDATA[<h2>症状</h2><p>公司一台数据库服务器上部署了IIS网站（IIS7），利用Sql Server Analysis Services的msmdpump.dll组件，实现了通过HTTP层来访问Analysis Services（MSAS不支持HTTP远程访问，非HTTP的远程访问也一直没成功过）。运行状况一直良好，最近突然罢工。Debug发现在建立连接的时候总是抛出“The Connection either timed out or was lost”。</p><h2>诊断</h2><p>尝试用企业管理器&#8230;</p>]]></description> <content:encoded><![CDATA[<h2>症状</h2><p>公司一台数据库服务器上部署了IIS网站（IIS7），利用Sql Server Analysis Services的msmdpump.dll组件，实现了通过HTTP层来访问Analysis Services（MSAS不支持HTTP远程访问，非HTTP的远程访问也一直没成功过）。运行状况一直良好，最近突然罢工。Debug发现在建立连接的时候总是抛出“The Connection either timed out or was lost”。</p><h2>诊断</h2><p>尝试用企业管理器直接连接Analysis Services，成功，数据访问也正常，说明Analysis Services服务运作正常。那看来问题是出在了IIS这一层。</p><p>直接在浏览器中通过http://machinename/olap/msmdpump.dll去访问的时候，会弹出一个保存文件的对话框。正常情况下，服务器会返回500，因为没有数据输入。现在弹出保存文件的对话框，说明IIS把这个dll资源当作一个普通文件来对待了，而不是调用ISAPI处理器来处理。</p><p>细看了网站的配置，似乎没有问题，重新部署了一个网站，重新配置了ISAPI处理器映射，问题依旧出现。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ISAPI处理器映射" border="0" alt="ISAPI处理器映射" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image.png" width="211" height="175" /></p><p>自己探索了很久，未果，Google了很久，一篇文章（<a title="IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes" href="http://blogs.msdn.com/rakkimk/archive/2007/11/03/iis7-running-32-bit-and-64-bit-asp-net-versions-at-the-same-time-on-different-worker-processes.aspx">IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes</a>）提醒了我。这篇文章讲的是如何在不同的应用程序池进程上同时使用32位和64位的Asp.Net。</p><p>公司服务器出于性能考虑，用了64位系统。相应的msmdpump.dll文件也是64位的，但IIS的应用程序池进程是多少位的，我倒还真没考虑过。任务管理器一看，只有一个&quot;w3wp.exe * 32”，果然是32位的。那问题的原因应该是，<strong><span style="color: #008000">32位的应用程序池无法加载64位的Isapi处理器</span></strong>。</p><p>知道了问题所在，解决方法也很简单，启动一个64位的应用程序池就行了。打开应用程序池的高级设置，找到了“启用32位应用程序（enable32bitAppOnWin64）”的设置，将其从原来的True改成False（默认值为False）。这个选项的作用就是允许在64位操作系统上，以32位的应用程序池去加载32位的程序。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="enable32bitAppOnWin64" border="0" alt="enable32bitAppOnWin64" src="http://www.imkevinyang.com/wp-content/uploads/2010/05/image1.png" width="358" height="33" /></p><p>之所以会突然出现这个问题，是因为IIS的机器配置文件ApplicationHost.config文件中，全局应用程序池的enable32bitAppOnWin64默认值被意外修改为True。而我部署的IIS网站，由于没有显式设置此选项，因此会继承ApplicationHost.config文件中的默认值。</p><h2>举一反三</h2><p>64位系统下经常会出现一些莫名其妙的问题。因为64位系统允许运行32位应用程序，但是32位程序却无法加载64位程序集。所以如果你发现你的32位程序无法正常启动，查一查是否因为目标程序集是64位的缘故。例如最近安装了微软的StreamInsight，发现是32位的，但是本地的Sql Compact Framework是64位，结果启动的时候抛出了个DllNotFoundException。</p><p style="text-align: right">——<a title="64位系统下IIS7 ISAPI处理器加载失败" href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8bIIS7%20ISAPI%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html"><em><strong>Kevin Yang</strong></em></a></p>标签：<a href="http://www.imkevinyang.com/tags/analysis-services" title="Analysis Services" rel="tag">Analysis Services</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/iis" title="IIS" rel="tag">IIS</a>, <a href="http://www.imkevinyang.com/tags/iis7" title="IIS7" rel="tag">IIS7</a>, <a href="http://www.imkevinyang.com/tags/isapi" title="ISAPI" rel="tag">ISAPI</a>, <a href="http://www.imkevinyang.com/categories/techarticles/knottyproblems" title="疑难杂症" rel="tag">疑难杂症</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2009/04/analysis-services-2005-olap%e8%ae%be%e8%ae%a1%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5.html" title="Analysis Services 2005 OLAP设计最佳实践 (2009/04/02)">Analysis Services 2005 OLAP设计最佳实践</a> (2009/04/02)</li><li><a href="http://www.imkevinyang.com/2010/04/analysis-services%ef%bc%9a%e4%bd%a0%e5%ba%94%e8%af%a5%e4%bd%bf%e7%94%a8%e5%a4%9a%e5%af%b9%e5%a4%9a%e7%bb%b4%e5%ba%a6%e5%90%97%ef%bc%9f.html" title="Analysis Services：你应该使用多对多维度吗？ (2010/04/12)">Analysis Services：你应该使用多对多维度吗？</a> (2010/04/12)</li><li><a href="http://www.imkevinyang.com/2009/03/bids%e9%83%a8%e7%bd%b2%e6%97%b6%e5%87%ba%e7%8e%b0%e5%85%83%e6%95%b0%e6%8d%ae%e7%ae%a1%e7%90%86%e5%99%a8%e5%8f%91%e7%94%9f%e9%94%99%e8%af%af.html" title="BIDS部署时出现元数据管理器发生错误 (2009/03/13)">BIDS部署时出现元数据管理器发生错误</a> (2009/03/13)</li><li><a href="http://www.imkevinyang.com/2009/06/iis7%e9%85%8d%e7%bd%aegzip%e5%8e%8b%e7%bc%a9.html" title="IIS7配置Gzip压缩 (2009/06/29)">IIS7配置Gzip压缩</a> (2009/06/29)</li><li><a href="http://www.imkevinyang.com/2009/08/olap%e4%b8%ad%e7%9a%84averageofchildren%e8%81%9a%e5%90%88%e6%96%b9%e5%bc%8f.html" title="OLAP中的AverageOfChildren聚合方式 (2009/08/10)">OLAP中的AverageOfChildren聚合方式</a> (2009/08/10)</li><li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> (2010/02/13)</li><li><a href="http://www.imkevinyang.com/2010/07/ssas%e5%a4%84%e7%90%86%e6%97%b6%e6%89%be%e4%b8%8d%e5%88%b0%e5%b1%9e%e6%80%a7%e9%94%ae%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95.html" title="SSAS处理时&ldquo;找不到属性键&rdquo;的解决办法 (2010/07/19)">SSAS处理时&ldquo;找不到属性键&rdquo;的解决办法</a> (2010/07/19)</li><li><a href="http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html" title="【推荐】两款HTTP流量分析工具的比较 (2009/11/08)">【推荐】两款HTTP流量分析工具的比较</a> (2009/11/08)</li><li><a href="http://www.imkevinyang.com/2010/05/%e4%b8%ba%e4%bb%80%e4%b9%88iis77-5%e7%9a%84gzip%e4%b8%8d%e8%b5%b7%e4%bd%9c%e7%94%a8.html" title="为什么IIS7/7.5的Gzip不起作用 (2010/05/08)">为什么IIS7/7.5的Gzip不起作用</a> (2010/05/08)</li><li><a href="http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html" title="使用相对Url无缝切换HTTP-HTTPS (2009/09/18)">使用相对Url无缝切换HTTP-HTTPS</a> (2009/09/18)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Silverlight启用Assembly Caching之后铁通用户无法访问</title><link>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html</link> <comments>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html#comments</comments> <pubDate>Sat, 13 Feb 2010 05:24:00 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[Silverlight]]></category> <category><![CDATA[Assembly Caching]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[HTTP Watch]]></category> <category><![CDATA[跨域]]></category> <category><![CDATA[重定向]]></category> <category><![CDATA[铁通]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html</guid> <description><![CDATA[<p>去年年底的时候，有客户向我们公司反映，他在自己公司内网（铁通ADSL）无法访问我们的Silverlight应用程序，而在他家里（网通ADSL）就可以正常访问。我们其他的客户并没有反映过类似的问题。</p><h2>问题分析排查</h2><p>由于他用的是笔记本，在家里和在公司访问时的系统环境是一样的，这样也就排除了系统环境的原因。那只能怀疑是网络环境的问题了。后来在现场使用HTTP Watch调试发现，当Silverlight在下载其中几个缓存程序集的zip包（我们的Si&#8230;</p>]]></description> <content:encoded><![CDATA[<p>去年年底的时候，有客户向我们公司反映，他在自己公司内网（铁通ADSL）无法访问我们的Silverlight应用程序，而在他家里（网通ADSL）就可以正常访问。我们其他的客户并没有反映过类似的问题。</p><h2>问题分析排查</h2><p>由于他用的是笔记本，在家里和在公司访问时的系统环境是一样的，这样也就排除了系统环境的原因。那只能怀疑是网络环境的问题了。后来在现场使用HTTP Watch调试发现，当Silverlight在下载其中几个缓存程序集的zip包（我们的Silverlight应用程序启用了Assembly Caching）时，HTTP请求被302永久重定向到一个奇怪的IP上。</p><p><img style="display: inline; border-width: 0px;" title="Silverlight启用Assembly Caching之后铁通用户无法访问" src="http://www.imkevinyang.com/wp-content/uploads/2010/02/image.png" border="0" alt="Silverlight启用Assembly Caching之后铁通用户无法访问" width="564" height="148" /></p><p>这样，由于zip包和Xap包地址的主机域不同，构成跨域，Silverlight会要求zip包所在的网站提供clientaccesspolicy.xml或者crossdomain.xml文件。而那个奇怪的IP所在网站下根本就没有这两个文件，所以请求失败。进而导致整个程序挂掉。</p><h2>Assembly Caching程序集缓存</h2><p>Assembly Caching（又称Application Library Caching）是Silverlight 3的新特性。以前Silverlight都是将所有用到的dll放到一个xap包之中，这样整个xap包会很大，下载相对比较慢。启用Assembly Caching之后，Silverlight工程用到的dll就可以在编译的时候自动打包到各自的zip包中，然后Silverlight在加载Xap包之后会自动下载这些zip包并解压出里头的dll，然后加载到应用程序域中。这样一来可以大大提高程序集下载的并行度，同时也可以使到不同Silverlight程序之间可以利用浏览器缓存而无需重复下载。</p><p>Silverlight在加载Xap包之后会去读取xap包中的appmanifest.xaml文件，然后下载该文件中指定的程序集文件。如果程序集文件Url和当前Xap包Url构造跨域（参考Silverlight SDK文档），则Silverlight会向该程序集所在网站的根目录请求跨域策略文件。</p><h2>为什么会被重定向</h2><p>这个问题困扰了我们很久。当时我们的第一反应是怀疑网关设置了什么规则。当用户访问特定Url的时候，触发了这个规则，导致HTTP请求被挟持。但是和客户公司网管沟通之后，对方明确表示并没有设置过类似的规则。</p><p>直到最近，客户和电信通（率属铁通）的人沟通之后，那边的技术人员说这是由于铁通的缓存加速服务器造成。据说是铁通为了让用户下载更快，就将某些HTTP请求进行重定向。后来电信通的技术人员告诉客户他们已经没问题了，但是他们并没有告知详细的问题所在，到底是由于我们的HTTP请求碰巧符合特定规则，还是怎么回事。也不知道他们是怎么解决的，是只将客户公司的IP列入禁止缓存列表，还是将我们Silverlight应用程序使用的域名加入禁止缓存列表，我们都无从知道。对于我们来说，这并没有真正解决问题。如果将来其他客户也通过铁通访问我们的产品，那么可能还是会出现类似的问题。由于我家里也是铁通的网络，所以我决定自己研究一下到底是怎么回事。</p><p>由于铁通那边没有任何可用的技术信息，Google也没有找到有价值的信息，唯一猜测的就是HTTP请求可能符合特定规则然后就被无辜重定向了。因此我只能采用最原始的人肉测试了。尝试不断的调整出问题的Url然后看是否被重定向了来发现规律。修改zip包所在目录，修改zip包文件名，修改zip包后缀，修改IIS的MIME类型，测试不同域名，等等。在历经100多次尝试之后，终于发现了<strong><span style="color: #008000;">当文件大小超过40K左右，并且后缀名是zip或者rar等常见的下载文件后缀，就会被铁通重定向。而且有时候第一、二次不会被重定向，刷新多几次的时候就才会被重定向</span></strong>。后面一点让我走了不少弯路，多少次我以为找到规律了，最后验证结论的时候还是错了。</p><p>o(︶︿︶)o</p><h2>怎么解决</h2><p>知道具体问题所在之后，我们几个技术人员就开始讨论如何解决这个问题。由于Silverlight对于缓存程序集打包之后的文件后缀没有要求，不管什么后缀，都会以zip文件流的格式去解析。因此可以修改打包文件的后缀来“逃过”铁通的魔掌。</p><p>修改文件后缀也有两种方法。</p><p>一种是在部署的时候，通过自动化脚本，修改所有zip文件后缀，然后修改xap包中appmanifest.xaml里头程序集的Url。这种方式的好处是一劳永逸，通用性强，以后部署的时候只需要执行一次脚本即可，其他应用程序可以共用。缺点是脚本编写比较复杂，并且部署的时候需要多加一步。</p><p>另外一种方法是将用到的Silverlight系统程序集放到工程底下，然后修改同名的xml配置文件，使其打包的文件使用其他后缀名。好处是这样编译完之后就可以直接部署了，无需执行什么操作，也不需要写脚本。坏处就是首先需要修改所有现有的工程，而且以后如果要开发新的Silverlight应用，也要记得这么做。</p><p>不管怎么样，这两种方法都不简单。后来我就想，既然客户可以和电信通联系，为什么我不可以直接和铁通联系呢。我就上网搜了一下北京铁通客户中心，找到申诉通道，填写完整的申述理由。然后第二天又打他们的客服电话去骚扰他们。结果过了两天，申述结果就下来了，“问题已解决”。对方客服还本着能自己动手决不麻烦别人的精神，帮我填写了用户满意度一栏：“非常满意”。</p><h2>更深层的东西</h2><p>其实最终解决问题的办法非常简单，就是投诉。我不满意你的服务，我就有权利投诉你。可是为什么一开始没有意识到这种解决办法呢？</p><p>我觉得这是和我们接触的社会环境有很大关系。我们潜意识里头已经习惯了各种中国式的流氓。运营商喜欢往你访问的网站中插播广告，访问我自己的博客偶尔还有弹窗广告；上Google搜索技术资料，一不小心点了blogspot的链接就导致Google被重置了，然后就10分钟不可用。没有明文规定告诉你什么是被禁止的，我们只能人肉测试。我们除了接受、适应并绕过这种事实之外还能做什么？也许我们还可以发出几声“中国式的抗议”吧。</p><p>言多必封，不多说了。</p><p style="text-align: right;">——<a title="Silverlight启用Assembly Caching之后铁通用户无法访问" href="http://www.imkevinyang.com/2010/02/Silverlight%e5%90%af%e7%94%a8Assembly%20Caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html"><em><strong>Kevin Yang</strong></em></a></p>标签：<a href="http://www.imkevinyang.com/tags/assembly-caching" title="Assembly Caching" rel="tag">Assembly Caching</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/http-watch" title="HTTP Watch" rel="tag">HTTP Watch</a>, <a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/%e8%b7%a8%e5%9f%9f" title="跨域" rel="tag">跨域</a>, <a href="http://www.imkevinyang.com/tags/%e9%87%8d%e5%ae%9a%e5%90%91" title="重定向" rel="tag">重定向</a>, <a href="http://www.imkevinyang.com/tags/%e9%93%81%e9%80%9a" title="铁通" rel="tag">铁通</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> (2010/05/05)</li><li><a href="http://www.imkevinyang.com/2009/11/asp-net%e9%a1%b5%e9%9d%a2%e7%9a%84%e7%bc%96%e7%a0%81%e9%97%ae%e9%a2%98.html" title="Asp.Net页面的编码问题 (2009/11/27)">Asp.Net页面的编码问题</a> (2009/11/27)</li><li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> (2009/09/18)</li><li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> (2009/02/28)</li><li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> (2009/03/02)</li><li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> (2010/05/04)</li><li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> (2009/04/06)</li><li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> (2009/03/02)</li><li><a href="http://www.imkevinyang.com/2010/03/silverlight%e7%9a%84%e4%be%9d%e8%b5%96%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%99%84%e5%8a%a0%e5%b1%9e%e6%80%a7.html" title="Silverlight的依赖属性与附加属性 (2010/03/28)">Silverlight的依赖属性与附加属性</a> (2010/03/28)</li><li><a href="http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html" title="【推荐】两款HTTP流量分析工具的比较 (2009/11/08)">【推荐】两款HTTP流量分析工具的比较</a> (2009/11/08)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>【推荐】两款HTTP流量分析工具的比较</title><link>http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html</link> <comments>http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html#comments</comments> <pubDate>Sun, 08 Nov 2009 09:19:30 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[实用工具]]></category> <category><![CDATA[Fiddler]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[HTTP Watch]]></category> <category><![CDATA[工具]]></category> <category><![CDATA[流量分析]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html</guid> <description><![CDATA[<p>做Web开发或者Web分析经常需要查看Http通讯的过程，项目实践中，很多Web相关的各种各样稀奇古怪的问题，最后都能通过分析HTTP流量得以解决。我到现在用过的比较好用的两个Http流量分析工具，一个是HTTP Watch，另外一个是Fiddler。</p><h2>HTTP Watch</h2><p>HTTP Watch是我最早用过的HTTP流量分析工具。它只能用于IE和Firefox浏览器上。</p><p>它有两种使用界面，一种是以插件的形式附加在浏览器上面，供实时分析使用。你可以看&#8230;</p>]]></description> <content:encoded><![CDATA[<p>做Web开发或者Web分析经常需要查看Http通讯的过程，项目实践中，很多Web相关的各种各样稀奇古怪的问题，最后都能通过分析HTTP流量得以解决。我到现在用过的比较好用的两个Http流量分析工具，一个是HTTP Watch，另外一个是Fiddler。</p><h2>HTTP Watch</h2><p>HTTP Watch是我最早用过的HTTP流量分析工具。它只能用于IE和Firefox浏览器上。</p><p>它有两种使用界面，一种是以插件的形式附加在浏览器上面，供实时分析使用。你可以看到当前窗口中所有的HTTP请求/响应过程。另外它允许把实时分析的结果保存为后缀名为hwl的文件，然后用其自带的Http Watch Studio工具打开，这样既方便了以后对此过程再次进行分析，也方便与其他人共享，易于调试。下面是它的插件界面的截图，非常清新简洁：</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb.png" width="574" height="218" /></p><p>它的界面非常简单，主要分成三部分：工具栏，HTTP消息概览，HTTP消息细节窗口。</p><p>工具栏主要是方便你快速过滤出你想要分析HTTP消息。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb1.png" width="350" height="266" /></p></p><p>你可以按照HTTP流量内容类型去筛选，例如只查看图片相关的HTTP流量。或者根据Url是否包含某特定字符串进行过滤，等等。另外工具栏也提供了“清缓存”和“清Cookie”两个非常常见的操作。</p><p>HTTP消息概览栏可以让你快速查看当前窗口中的所有HTTP消息，每个HTTP消息花费的时间，以及服务器返回的状态码，请求的Url等等。默认它还会按照HTTP消息发起的页面进行分组，方便查看。</p><p>最底部就是每条HTTP消息的详细信息。最后面的Stream标签页显示的是最原始的HTTP请求/响应流。这里记录的信息是最详细的。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb2.png" width="483" height="153" /></p><p>为了方便分析常见的需求，它将HTTP消息分成几个部分，也就是你上面看到的Headers、Cookies、QueryString、PostData等等标签页所展示的内容。下面的图展示了此次HTTP通讯涉及的Cookie，每个Cookie的键值，作用的主机域以及路径、过期时间等。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb3.png" width="528" height="96" /></p><p>HTTP Watch Studio就不做介绍了，基本和插件版本的一致，只不过可以脱离浏览器直接分析以前保存的HTTP通讯过程。</p><p>HTTP Watch提供了基础版本以及专业版本，其中基础版本是免费的。事实上基础版本提供的功能已经能够适用于大多数的情况了。</p><p>官方站点：<a title="http://www.httpwatch.com" href="http://www.httpwatch.com">http://www.httpwatch.com</a></p><h2>Fiddler</h2><p>Fiddler是微软推出的一个免费的HTTP流量分析工具。一开始我以为他只支持IE——毕竟是微软的东西——加之常见的功能HTTP Watch都已经够用了，就没怎么关注。这些天因为要调试Chrome浏览器上的一些问题，而Chrome自带的开发者工具又非常糟糕，搜着搜着又再次找到了Fiddler。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb4.png" width="484" height="234" /></p><p>Fiddler的界面和HTTP Watch差不多，都是分成三部分，工具栏+HTTP通讯总览+HTTP消息细节。只不过默认情况下它把HTTP消息细节窗口放到了右边。</p><p>用了一阵子发现，HTTP Watch能做到的，基本在Fiddler上都可以实现。不过Fiddler的界面显得比HTTP Watch要复杂一些，因为它提供了一些HTTP Watch没有的功能。下面主要介绍的是它和HTTP Watch不一样的地方，一样的功能就略过了。</p><p>Fiddler能够监视所有本地进程的HTTP消息，而不仅限于IE、Firefox这些浏览器。这比HTTP Watch适用范围更广。下图显示了google talk和Visual Studio发起的HTTP请求.</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb5.png" width="556" height="94" /></p><p>安装完Fiddler之后你会发现IE还有Firefox中都多了个Fiddler的插件，Fiddler的原理实际上是在本地启动HTTP代理服务器，因为除了Firefox以外，很多应用程序包括其他浏览器都会应用IE上设置的代理。所以Fiddler只需要设置IE和Firefox这两个浏览器的代理服务器即可。这个插件做的事情实际上就是起到动态切换代理服务器的作用。</p><p>选中左侧某条特定的HTTP请求，Fiddler会在右侧帮你统计一下当前选中的HTTP消息的一些性能指标，例如发送/接受字节数，发送/接收时间，还有粗略统计世界各地访问该服务器所花费的时间。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb6.png" width="190" height="312" />&#160;</p><p>在右侧窗口中，你可以采用各种视图去解析同一个HTTP请求/响应。例如以纯文本视图，或者图片视图，十六进制视图等等。它还提供了一个压缩测试工具，告诉你如果启用了Gzip或者deflate等压缩之后能够节省多少传输字节。</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/11/image_thumb7.png" width="352" height="271" /></p><p>Fiddler会记录下每次HTTP通讯的过程，然后允许你在不将请求发送给服务器的情况下返回之前记录的响应结果。</p><p>Fiddler还允许你对HTTP请求下断点，然后你可以根据情况来决定每个请求所返回的响应。</p><p>如果你想测试一些特殊的HTTP请求或者修改当前请求一些报头的时候，你不需要自己再写一个小程序去实现这样的功能，因为在Fiddler提供了直接编写HTTP请求的功能。你可以模拟浏览器去发送HTTP消息。</p><p>Fiddler支持插件机制，如果你觉得它提供的功能还不够用，那么你可以安装各种插件以增强它的功能或者编写自己的插件。官网上提供了几个不错的插件供免费下载。一个可以用于对HTML和Javascript代码进行语法着色，还有一个可以监视Web应用程序的安全隐患。</p><p>官方站点：<a title="http://www.fiddler2.com" href="http://www.fiddler2.com">http://www.fiddler2.com</a></p><h2>总结</h2><p>总的来说，HTTP Watch的使用相比Fiddler更简洁、容易上手。但是只适用于IE和Firefox。Fiddler功能更为强大，适用范围更广，而且还是免费的。具体用哪个就得看实际需求了。</p><p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>标签：<a href="http://www.imkevinyang.com/tags/fiddler" title="Fiddler" rel="tag">Fiddler</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/http-watch" title="HTTP Watch" rel="tag">HTTP Watch</a>, <a href="http://www.imkevinyang.com/categories/techarticles/usefultools" title="实用工具" rel="tag">实用工具</a>, <a href="http://www.imkevinyang.com/tags/%e5%b7%a5%e5%85%b7" title="工具" rel="tag">工具</a>, <a href="http://www.imkevinyang.com/tags/%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90" title="流量分析" rel="tag">流量分析</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> (2010/05/05)</li><li><a href="http://www.imkevinyang.com/2009/11/asp-net%e9%a1%b5%e9%9d%a2%e7%9a%84%e7%bc%96%e7%a0%81%e9%97%ae%e9%a2%98.html" title="Asp.Net页面的编码问题 (2009/11/27)">Asp.Net页面的编码问题</a> (2009/11/27)</li><li><a href="http://www.imkevinyang.com/2010/01/document-referrer%e4%b8%a2%e5%a4%b1%e7%9a%84%e5%87%a0%e4%b8%aa%e5%8e%9f%e5%9b%a0.html" title="Document.Referrer丢失的几个原因 (2010/01/18)">Document.Referrer丢失的几个原因</a> (2010/01/18)</li><li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> (2010/02/13)</li><li><a href="http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html" title="使用相对Url无缝切换HTTP-HTTPS (2009/09/18)">使用相对Url无缝切换HTTP-HTTPS</a> (2009/09/18)</li><li><a href="http://www.imkevinyang.com/2009/03/%e5%85%8d%e8%b4%b9%e7%9a%84seo%e6%a3%80%e6%b5%8b%e5%b7%a5%e5%85%b7.html" title="免费的SEO检测工具 (2009/03/22)">免费的SEO检测工具</a> (2009/03/22)</li><li><a href="http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html" title="当Google Analytics、Firefox和IIS走到了一起&#8230; (2010/05/29)">当Google Analytics、Firefox和IIS走到了一起&#8230;</a> (2010/05/29)</li><li><a href="http://www.imkevinyang.com/2010/07/%e6%99%92%e6%99%92%e8%87%aa%e5%b7%b1%e7%94%b5%e8%84%91%e9%87%8c%e7%9a%84%e5%b8%b8%e7%94%a8%e5%b7%a5%e5%85%b7.html" title="晒晒自己电脑里的常用工具 (2010/07/20)">晒晒自己电脑里的常用工具</a> (2010/07/20)</li><li><a href="http://www.imkevinyang.com/2010/01/%e9%ab%98%e6%95%88%e4%bd%bf%e7%94%a8google-analytics%e8%bf%9b%e8%a1%8cweb%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90.html" title="高效使用Google Analytics进行Web流量分析 (2010/01/02)">高效使用Google Analytics进行Web流量分析</a> (2010/01/02)</li><li><a href="http://www.imkevinyang.com/2009/06/%ef%bc%88%e8%bd%ac%ef%bc%89iis6%e4%b8%8a%e5%90%af%e7%94%a8gzip%e5%8e%8b%e7%bc%a9http%e5%8e%8b%e7%bc%a9-%e8%af%a6%e8%a7%a3.html" title="（转）IIS6上启用Gzip压缩(HTTP压缩) 详解 (2009/06/28)">（转）IIS6上启用Gzip压缩(HTTP压缩) 详解</a> (2009/06/28)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html/feed</wfw:commentRss> <slash:comments>12</slash:comments> </item> <item><title>使用相对Url无缝切换HTTP-HTTPS</title><link>http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html</link> <comments>http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html#comments</comments> <pubDate>Thu, 17 Sep 2009 18:05:40 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[Web传统技术]]></category> <category><![CDATA[技术随笔]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[HTTPS]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[Scheme省略]]></category> <category><![CDATA[URI]]></category> <category><![CDATA[Url]]></category> <category><![CDATA[相对URL]]></category> <category><![CDATA[相对路径]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html</guid> <description><![CDATA[<h2>概述</h2><p>在HTTPS的网站下，如果要访问HTTP资源，那么一般浏览器会弹出窗口询问用户是否允许加载不安全内容，云云。为了避免出现这样干扰用户的情况，所有网页下请求的资源都都必须是HTTPS资源。如果你的站点支持HTTP和HTTPS两种方式访问，而实际网站只有一份的话，这种情况下，你可以使用相对Url的方式改写网页内资源的请求Url。</p><h2>省略Scheme的相对Url语法</h2><p>Url相对路径我们并不陌生，下面这样的写法非常常见。</p><pre class="csharpcode"><span class="kwrd">&#60;</span><span class="html">img</span> <span class="attr">src</span><span class="kwrd">='/&#8230;</span></pre>]]></description> <content:encoded><![CDATA[<h2>概述</h2><p>在HTTPS的网站下，如果要访问HTTP资源，那么一般浏览器会弹出窗口询问用户是否允许加载不安全内容，云云。为了避免出现这样干扰用户的情况，所有网页下请求的资源都都必须是HTTPS资源。如果你的站点支持HTTP和HTTPS两种方式访问，而实际网站只有一份的话，这种情况下，你可以使用相对Url的方式改写网页内资源的请求Url。</p><h2>省略Scheme的相对Url语法</h2><p>Url相对路径我们并不陌生，下面这样的写法非常常见。</p><pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">img</span> <span class="attr">src</span><span class="kwrd">='/images/myphoto.jpg'</span> <span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;</span><span class="html">img</span> <span class="attr">src</span><span class="kwrd">='myphoto.jpg'</span> <span class="kwrd">/&gt;</span></pre><p>如果该HTML代码放在http://myexample.com/myblog/index.html上，那么第一幅图片的实际完整地址就是http://myexample.com/images/myphoto.jpg，而第二幅图片的实际地址是http://myexample.com/myblog/myphoto.jpg。</p><p>但是省略Url中的Scheme部分这样的相对路径写法却比较少见。例如：</p><pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">img</span> <span class="attr">src</span><span class="kwrd">='//myimagehosting.com/images/myphoto.jpg'</span> <span class="kwrd">/&gt;</span></pre><p>这行代码如果放在HTTP的网页上，那么请求的资源就是HTTP:<span class="kwrd">//myimagehosting.com/images/myphoto.jpg，如果放在HTTPS上，则访问的资源就是HTTPS的。这样一来我们就无需为HTTP和HTTPS各自准备不同的网页了。</span></p><h2><span class="kwrd">标准规范</span></h2><p><span class="kwrd"></span></p><p><span class="kwrd"></span></p><p>RFC1808文档是专门针对相对URI的，其中提到，除了URI中的Scheme部分，其他部分均可以做适当的省略。也就是说，这样的写法是不符合规范。RFC1808文档是95年的时候定稿的。后来的RFC3986文档对URI做出了更为详细的规范，废弃了RFC1808对相对URI引用的建议规范（4.2 Relative Reference一节）。</p><p><strong><font color="#008000"></p><p>以Scheme:开头的（如http:、file:、ftp:）均为绝对URI引用。否则为相对URI引用。</p><p>相对路径 = 相对部分 [ &quot;?&quot; 查询参数] [ &quot;#&quot; 锚点]</p><p> </font></strong></p><p>其中相对部分可以有以下几种情况：</p><p>1. //主机域 绝对路径或者留空</p><p>2. 绝对路径</p><p>3. 相对路径</p><p>4. 留空</p><p>也就是说，以下几种情况均是合法的相对URI引用：</p><pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">src</span><span class="kwrd">='//myscript.com/script.js?cid=abcd'</span><span class="kwrd">&gt;&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>
&lt;script src=<span class="str">'//myscript.com?cid=abcd'</span>&gt;&lt;/script&gt;
&lt;script src=<span class="str">'/script.js?cid=abcd'</span>&gt;&lt;/script&gt;
&lt;script src=<span class="str">'../script.js?cid=abcd'</span>&gt;<span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre><h2>总结</h2><p>以上这种省略Scheme部分的相对路径的写法在IE7、IE8、Firefox、Chrome、Opera以及Safari中均测试通过。pconline上面就有用到这样的写法。使用这个特性，可以降低代码的复杂性。Google Analytics在生成代码的时候会检测当前协议来决定加载http还是https的脚本，然后动态插入一段脚本。不知道为什么它不使用这样的方式来实现自适应。</p><p>参考文档：</p><p><a href="http://nedbatchelder.com/blog/200710/httphttps_transitions_and_relative_urls.html">Http-https transitions and relative URLs</a></p><p><a title="RFC3986 Uniform Resource Identifier" href="http://www.ietf.org/rfc/rfc3986.txt" target="_blank">RFC3986</a></p><p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>标签：<a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/https" title="HTTPS" rel="tag">HTTPS</a>, <a href="http://www.imkevinyang.com/tags/javascript" title="Javascript" rel="tag">Javascript</a>, <a href="http://www.imkevinyang.com/tags/scheme%e7%9c%81%e7%95%a5" title="Scheme省略" rel="tag">Scheme省略</a>, <a href="http://www.imkevinyang.com/tags/uri" title="URI" rel="tag">URI</a>, <a href="http://www.imkevinyang.com/tags/url" title="Url" rel="tag">Url</a>, <a href="http://www.imkevinyang.com/categories/techarticles/web%e4%bc%a0%e7%bb%9f%e6%8a%80%e6%9c%af" title="Web传统技术" rel="tag">Web传统技术</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e7%9b%b8%e5%af%b9url" title="相对URL" rel="tag">相对URL</a>, <a href="http://www.imkevinyang.com/tags/%e7%9b%b8%e5%af%b9%e8%b7%af%e5%be%84" title="相对路径" rel="tag">相对路径</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> (2010/05/05)</li><li><a href="http://www.imkevinyang.com/2009/11/button%e6%a0%87%e7%ad%be%e9%bc%a0%e6%a0%87%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e8%a7%a6%e5%8f%91%e6%ba%90%e9%97%ae%e9%a2%98.html" title="Button标签鼠标点击事件的触发源问题 (2009/11/27)">Button标签鼠标点击事件的触发源问题</a> (2009/11/27)</li><li><a href="http://www.imkevinyang.com/2009/03/ie%e4%b8%ad%e4%bd%bf%e7%94%a8windowopen%e6%89%93%e5%bc%80%e6%96%b0%e7%aa%97%e5%8f%a3%e6%97%b6%e6%97%a0%e6%b3%95%e8%8e%b7%e5%8f%96referrer%e5%af%b9%e8%b1%a1.html" title="IE中使用window.open打开新窗口时无法获取Referrer对象 (2009/03/07)">IE中使用window.open打开新窗口时无法获取Referrer对象</a> (2009/03/07)</li><li><a href="http://www.imkevinyang.com/2009/07/javascript-%e4%b8%ad%e7%9a%84false%e9%9b%b6%e5%80%bcnullundefined%e5%92%8c%e7%a9%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%af%b9%e8%b1%a1.html" title="Javascript 中的false,零值,null,undefined和空字符串对象 (2009/07/07)">Javascript 中的false,零值,null,undefined和空字符串对象</a> (2009/07/07)</li><li><a href="http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html" title="Javascript中获取出错代码所在文件及行数 (2009/05/18)">Javascript中获取出错代码所在文件及行数</a> (2009/05/18)</li><li><a href="http://www.imkevinyang.com/2009/04/javascript%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%93%88%e5%b8%8c%e5%87%bd%e6%95%b0.html" title="Javascript字符串哈希函数 (2009/04/11)">Javascript字符串哈希函数</a> (2009/04/11)</li><li><a href="http://www.imkevinyang.com/2009/06/javascript%e6%93%8d%e7%ba%b5cookie.html" title="Javascript操纵Cookie (2009/06/11)">Javascript操纵Cookie</a> (2009/06/11)</li><li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> (2010/02/13)</li><li><a href="http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html" title="【推荐】两款HTTP流量分析工具的比较 (2009/11/08)">【推荐】两款HTTP流量分析工具的比较</a> (2009/11/08)</li><li><a href="http://www.imkevinyang.com/2010/05/%e4%b8%ba%e4%bb%80%e4%b9%88iis77-5%e7%9a%84gzip%e4%b8%8d%e8%b5%b7%e4%bd%9c%e7%94%a8.html" title="为什么IIS7/7.5的Gzip不起作用 (2010/05/08)">为什么IIS7/7.5的Gzip不起作用</a> (2010/05/08)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>（转）IIS6上启用Gzip压缩(HTTP压缩) 详解</title><link>http://www.imkevinyang.com/2009/06/%ef%bc%88%e8%bd%ac%ef%bc%89iis6%e4%b8%8a%e5%90%af%e7%94%a8gzip%e5%8e%8b%e7%bc%a9http%e5%8e%8b%e7%bc%a9-%e8%af%a6%e8%a7%a3.html</link> <comments>http://www.imkevinyang.com/2009/06/%ef%bc%88%e8%bd%ac%ef%bc%89iis6%e4%b8%8a%e5%90%af%e7%94%a8gzip%e5%8e%8b%e7%bc%a9http%e5%8e%8b%e7%bc%a9-%e8%af%a6%e8%a7%a3.html#comments</comments> <pubDate>Sun, 28 Jun 2009 13:07:00 +0000</pubDate> <dc:creator>Kevin Yang</dc:creator> <category><![CDATA[技术随笔]]></category> <category><![CDATA[GZip]]></category> <category><![CDATA[HTTP]]></category> <category><![CDATA[IIS]]></category> <category><![CDATA[IIS6]]></category> <category><![CDATA[压缩]]></category><guid isPermaLink="false">http://www.imkevinyang.com/2009/06/%ef%bc%88%e8%bd%ac%ef%bc%89iis6%e4%b8%8a%e5%90%af%e7%94%a8gzip%e5%8e%8b%e7%bc%a9http%e5%8e%8b%e7%bc%a9-%e8%af%a6%e8%a7%a3.html</guid> <description><![CDATA[<h2>摘要</h2><p>本文总结了如何为使用IIS托管的网站启用Gzip压缩, 从而减少网页网络传输大小, 提高用户显示页面的速度.</p><h2>前言.</h2><p>本文的知识点是从互联网收集整理, 主要来源于中文wiki.&#160; 使用YSlow检测网站启用了哪些优化时, Gzip是十分关键的一项. 启动Gip压缩将立竿见影的减少页面的网络传输大小.</p><h2>压缩概述</h2><p>HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScri&#8230;</p>]]></description> <content:encoded><![CDATA[<h2>摘要</h2><p>本文总结了如何为使用IIS托管的网站启用Gzip压缩, 从而减少网页网络传输大小, 提高用户显示页面的速度.</p><h2>前言.</h2><p>本文的知识点是从互联网收集整理, 主要来源于中文wiki.&#160; 使用YSlow检测网站启用了哪些优化时, Gzip是十分关键的一项. 启动Gip压缩将立竿见影的减少页面的网络传输大小.</p><h2>压缩概述</h2><p>HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScript或CSS文件。压缩的最大好处就是降低了网络传输的数据量，从而提高客户端浏览器的访问速度。当然，同时也会增加一点点服务器的负担。Gzip是比较常见的一种HTTP压缩算法。</p><h2>HTTP压缩工作原理</h2><p>Web服务器处理HTTP压缩的工作原理如下：</p><p>1.Web服务器接收到浏览器的HTTP请求后，检查浏览器是否支持HTTP压缩；</p><p>在用户浏览器发送请求的HTTP头中,&#160; 带有&quot;Accept-Encoding: gzip, deflate&quot;参数则表明支持gzip和deflate两种压缩算法.</p><p>2.如果浏览器支持HTTP压缩，Web服务器检查请求文件的后缀名；</p><p>静态文件和动态文件后缀启动要所都需要在MetaBase.xml中设置.</p><p>静态文件需要设置: <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/c78624a9-f287-4bce-b0d7-c39a25cd39da.mspx">HcFileExtensions Metabase Property</a> (单击跳转到MSDN说明)</p><p>动态文件需要设置: <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/90a64e8d-c388-48e3-be49-009e0db567a1.mspx">HcScriptFileExtensions Metabase Property</a> (单击跳转到MSDN说明)</p><p>3.如果请求文件是HTML、CSS等静态文件并且文件后缀启用了压缩，则Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件；</p><p>4.如果请求文件的压缩文件不存在，Web服务器向浏览器返回未压缩的请求文件，并在压缩缓冲目录中存放请求文件的压缩文件；</p><p>5.如果请求文件的最新压缩文件已经存在，则直接返回请求文件的压缩文件；</p><p>6.如果请求文件是ASPX等动态文件并且文件后缀启用了压缩，Web服务器动态压缩内容并返回浏览器，压缩内容不存放到压缩缓存目录中。</p><h2>在IIS6中启用HTTP压缩</h2><p>IIS默认并不支持HTTP压缩，需要进行简单的配置</p><p>1.打开Internet信息服务(IIS)管理器，右击&quot;网站&quot;-&gt;&quot;属性&quot;，选择&quot;服务&quot;。在&quot;HTTP压缩&quot;框中选中&quot;压缩应用程序文件&quot;和&quot;压缩静态文件&quot;，按需要设置&quot;临时目录&quot;和&quot;临时目录的最大限制&quot;；</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image001-thumb.png" width="244" height="207" /></p><p>2.提醒: 经试验此步骤在本人机器上没有作用, 可以忽略.</p><p>在Internet信息服务(IIS)管理器，右击&quot;Web服务扩展&quot;-&gt;&quot;增加一个新的Web服务扩展...&quot;，在&quot;新建Web服务扩展&quot;框中输入扩展名&quot;HTTP Compression&quot;，添加&quot;要求的文件&quot;为C:\WINDOWS\system32\inetsrv\gzip.dll，其中Windows系统目录根据您的安装可能有所不同，选中&quot;设置扩展状态为允许&quot;；</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image002-thumb.png" width="244" height="161" /></p><p>3.使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml(建议先备份),</p><p>找到Location =&quot;/LM/W3SVC/Filters/Compression/gzip用于设置gzip压缩，</p><p>找到Location =&quot;/LM/W3SVC/Filters/Compression/deflate&quot;用于设置deflate压缩.</p><p>上面两个节点紧挨着.并且设置的属性相同.</p><p>如果需要压缩动态文件，则将HcDoDynamicCompression设置为&quot;TRUE&quot;，并在HcScriptFileExtensions中增加您要压缩的动态文件后缀名，如aspx；如果需要压缩静态文件，则将HcDoStaticCompression和HcDoOnDemandCompression设置为&quot;TRUE&quot;，并在HcFileExtensions中增加您需要压缩的静态文件后缀名，如xml、css等；HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的压缩率，数值在0-10, 默认为0.</p><p>HcDynamicCompressionLevel属性说明:<a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/0d785bb2-8b9b-46db-96a5-a8343970324b.mspx">HcDynamicCompressionLevel Metabase Property</a></p><p>HcOnDemandCompLevel 属性说明:<a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/c63788cc-70b4-4a44-a9a3-329fa8fb3afb.mspx">HcOnDemandCompLevel Metabase Property</a></p><p>说明: 这两个属性值一般推荐设置为9, 具有最佳性价比.但是在我的window server 2003上, 压缩率无论如何设置, jQuery和jQuery UI两个文件(58k/188k)压缩后的大小一直相同.(20k/45k).&#160;</p><p>下面是我的实例:</p><p>&lt;IIsCompressionScheme Location =&quot;/LM/W3SVC/Filters/Compression/deflate&quot; HcCompressionDll=&quot;%windir%\system32\inetsrv\gzip.dll&quot; HcCreateFlags=&quot;0&quot; HcDoDynamicCompression=&quot;TRUE&quot; HcDoOnDemandCompression=&quot;TRUE&quot; HcDoStaticCompression=&quot;true&quot; HcDynamicCompressionLevel=&quot;9&quot; HcFileExtensions=&quot;htm html txt js css swf xml&quot; HcOnDemandCompLevel=&quot;9&quot; HcPriority=&quot;1&quot; HcScriptFileExtensions=&quot;asp</p><p>aspx dll exe&quot; &gt; &lt;/IIsCompressionScheme&gt; &lt;IIsCompressionScheme Location =&quot;/LM/W3SVC/Filters/Compression/gzip&quot; HcCompressionDll=&quot;%windir%\system32\inetsrv\gzip.dll&quot; HcCreateFlags=&quot;1&quot; HcDoDynamicCompression=&quot;TRUE&quot; HcDoOnDemandCompression=&quot;TRUE&quot; HcDoStaticCompression=&quot;true&quot; HcDynamicCompressionLevel=&quot;9&quot; HcFileExtensions=&quot;htm html txt js css swf xml&quot; HcOnDemandCompLevel=&quot;9&quot; HcPriority=&quot;1&quot; HcScriptFileExtensions=&quot;asp</p><p>aspx dll exe&quot; &gt; &lt;/IIsCompressionScheme&gt;</p><p>4.编辑完毕后保存MetaBase.xml文件；如果文件无法保存，则可能IIS正在使用该文件。打开&quot;开始&quot;-&gt;&quot;管理工具&quot;-&gt;&quot;服务&quot;，停止&quot;IIS Admin Service&quot;后，即可保存；</p><p>5.最后，重新启动IIS。可以到HTTP压缩测试网站验证结果.以jQuery为例, 核心类库和UI类库原始大小分别是57k和188k,压缩后分别是20k和45k:</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image003-thumb.png" width="244" height="16" /></p><p>我们通过Http头中的: Content-Encoding:gzip 属性判断返回后的数据已经启用了gzip压缩:</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image004-thumb.png" width="244" height="117" /></p><p>使用YSlow检测, 当只启动静态文件压缩时, Gzip压缩评级为B:</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image005-thumb.png" width="244" height="33" /></p><p>当同时启动了动态文件压缩时, Gzip压缩评级为A:</p><p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://www.imkevinyang.com/wp-content/uploads/2009/06/clip-image006-thumb.png" width="188" height="31" /></p><h2>要点总结</h2><p>1. 在修改MetaBase.xml文件时, 要停止&quot;IIS Admin Service&quot;服务. 否则无法保存.</p><p>2.静态压缩和动态压缩率最好设置为9.&#160;</p><p>3.上文的步骤2, 即使不添加Web服务扩展效果也是相同的.</p><p>4.压缩率设置对js文件不起作用, 压缩后大小总是相同的.</p><p>5.图片文件即使启用了gzip压缩大小也没有变化.</p>标签：<a href="http://www.imkevinyang.com/tags/gzip" title="GZip" rel="tag">GZip</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/iis" title="IIS" rel="tag">IIS</a>, <a href="http://www.imkevinyang.com/tags/iis6" title="IIS6" rel="tag">IIS6</a>, <a href="http://www.imkevinyang.com/tags/%e5%8e%8b%e7%bc%a9" title="压缩" rel="tag">压缩</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a><br /><h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4><ul class="st-related-posts"><li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> (2010/05/05)</li><li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> (2010/02/13)</li><li><a href="http://www.imkevinyang.com/2009/11/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%b8%a4%e6%ac%behttp%e6%b5%81%e9%87%8f%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e7%9a%84%e6%af%94%e8%be%83.html" title="【推荐】两款HTTP流量分析工具的比较 (2009/11/08)">【推荐】两款HTTP流量分析工具的比较</a> (2009/11/08)</li><li><a href="http://www.imkevinyang.com/2010/05/%e4%b8%ba%e4%bb%80%e4%b9%88iis77-5%e7%9a%84gzip%e4%b8%8d%e8%b5%b7%e4%bd%9c%e7%94%a8.html" title="为什么IIS7/7.5的Gzip不起作用 (2010/05/08)">为什么IIS7/7.5的Gzip不起作用</a> (2010/05/08)</li><li><a href="http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html" title="使用相对Url无缝切换HTTP-HTTPS (2009/09/18)">使用相对Url无缝切换HTTP-HTTPS</a> (2009/09/18)</li><li><a href="http://www.imkevinyang.com/2010/05/%e5%bd%93google-analytics%e3%80%81firefox%e5%92%8ciis%e8%b5%b0%e5%88%b0%e4%ba%86%e4%b8%80%e8%b5%b7.html" title="当Google Analytics、Firefox和IIS走到了一起&#8230; (2010/05/29)">当Google Analytics、Firefox和IIS走到了一起&#8230;</a> (2010/05/29)</li></ul>]]></content:encoded> <wfw:commentRss>http://www.imkevinyang.com/2009/06/%ef%bc%88%e8%bd%ac%ef%bc%89iis6%e4%b8%8a%e5%90%af%e7%94%a8gzip%e5%8e%8b%e7%bc%a9http%e5%8e%8b%e7%bc%a9-%e8%af%a6%e8%a7%a3.html/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>