随笔 - 13  文章 - 0  评论 - 14 
  2009年7月3日

前言

目前,微软的官方网站已经有了详细的脚本,来指导用户对IIS和Apache做配置,实现IE8兼容,但是对其他的主流服务器则没有做更多介绍,由于工作需要,我这边在工作的时候,做了一些其他服务器中配置的办法。Nginx服务器到目前为止,差不多占据了服务器市场的10%的市场份额,而中国区也差不多有250万的网站用户,所以有必要讲讲如何去配置兼容性。

本文主要是介绍在Nginx服务器中的配置办法,包括以下内容:

  • 前言
  • 配置思路
  • 在Nginx-Win32版本中的配置办法
  • 在Nginx-Linux版本中的配置办法

配置思路

大家知道,根据微软MSDN中的文章介绍,发现无论是IIS,还是Apache,都是通过在服务器端的Http Header模块添加了兼容性设置标签,服务器处理客户端页面请求时,自动在当前返回结果中添加一个http头信息,即“X-UA-Compatible:IE=EmulateIE7”,这个时候IE8接收到包含这部分头信息的网页时,自动以指定的兼容性模式显示。根据这个原理,我们在Nginx服务器服务器也可以去做类似的配置。

在继续阅读具体IE8兼容性配置办法前,请阅读一下“NginxChsHttpHeadersModule”内容,这里专门介绍了在Nginx服务器中处理Http都信息模块的内容。

 

在Nginx-Win32版本中的配置办法

1、 在windows server 2003中部署nginx-0.6.36-win32版本

2、 打开“\nginx\conf”目录下的“nginx.conf”文件,并按照下面格式增加兼容性标记

clip_image002

3、 重新启动nginx服务

4、 浏览nginx默认站点,http://localhost,并用httpwatch来抓包监控,会发现已经正常工作

clip_image004

在Nginx-Linux版本中的配置办法

 

1、 在ubuntu9.0.4中安装nginx服务器

2、 打开“/etc/nginx/nginx.conf”文件,并添加兼容性标记,如下图所示

clip_image002[6]

3、 测试运行结果

在我的默认目录下,我拷贝了一个1.html的文件,作为测试的目标

clip_image004[5]

在另外一台计算机上面,访问http://192.168.154.129/1.html地址(这是我测试计算机的地址),并通过httpwatch工具抓包,会获取到兼容性设置的http头信息;

clip_image006

在IE浏览器中,也正常工作。

clip_image008

posted @ 2009-07-03 17:08 月华 阅读(358) 评论(0) 编辑

前言

从今年3月中旬微软的IE8发布到现在,差不多有4个月了,这期间一直协助国内的网络公司做IE8兼容性的工作。由于工作的性质原因,现在几乎是与人见面就问,你的网站与IE8兼容了吗?协助国内网站做IE8的兼容性,差不多是最近一段时间的工作的全部。

为什么不兼容性

为什么微软IE8发布后,要求网站去做兼容了,要回答这个问题,我们就必须看看微软IE的发展历程,就不难明白其中的原因。微软的IE6是通过XP、Win2003等操作系统发布出来,作为占统治地位的桌面操作系统,也使得IE占据了通知地位,许多的网站开发的时候,就按照IE6的标准去开发,而IE6自身的标准也是微软公司内部定义的。到了IE7出来的时候,采用了微软公司内部标准以及部分W3C的标准,这个时候许多网站升级到IE7的时候,就比较痛苦,很多代码必须调整后,才能够正常的运行。而到了微软的IE8这个版本,基本上把微软内部自己定义的标准抛弃了,而全面的支持W3C的标准,由于基于对标准彻底的变化了,使得原先在早期IE8版本上能够访问的网站,在IE8中无法正常的访问,会出现一些排版错乱、文字重叠,显示不全等各种兼容性错误。这个时候就必需想办法使得旧有的网站能够兼容,保证这些网站能够得到正确的显示结果。

用户怎么办?

作为一般的用户,在查看某个网站时候,发现当前的页面有了不兼容的情况产生时,可以鼠标轻轻的点击地址栏右边的兼容性视图切换按钮,则可以在兼容性模式下查看当前网页。如果不想这么麻烦,可以直接打开“工具”—“兼容性视图设置”对话框,把本地IE8浏览器设置为“使用兼容模式来查看所有网站”,那么这个时候你访问网站的时候,都可以在兼容模式下显示站点内容了。

网站提供商怎么办

从网站的角度看来,必需要自身做到兼容,使得那些采用IE8标准模式来查看网站的用户也能够得到正确的显示结果,通过在网站中做一些设置,使得客户查看你的网站时候,能够自动以兼容模式显示。

第一种办法,是在单个的页面中,添加兼容性标记,示例代码如下:

<html>
   <head>
   <!-- Mimic Internet Explorer 7 -->
      <title>我的网页</title>
      <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
   </head>
   <body>
      <p>内容在此处。</p>
   </body>
10 </html>
11

在这里添加兼容性标签后,只对当前页面有用,而且必须是在head标签内部,同时也必须是在其他css样式定义或者链接的前面,否则不会产生效果的。

第二种办法,就是在站点的配置文件中,修改web.config文件,使得该网站能够兼容,示例代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name="X-UA-Compatible" value="IE=EmulateIE7">
      </customHeaders>
    </httpProtocol>
10   <system.webServer>
11 </configuration> 
12

第三种办法,就是在服务器级别对当前服务器做设置,使得服务器下面所有的站点都能够与IE8兼容性,这是推荐的做法,通过在服务器的配置花的时间最少,由于是整个服务器起作用,因此能很好的解决潜在的兼容性问题,具体设置可以参考以下资料介绍网站兼容的4个层次:

1、IIS,http://msdn.microsoft.com/zh-cn/library/cc817572.aspx

2、Apache,http://msdn.microsoft.com/zh-cn/library/cc817573.aspx

3、其他服务器,在后续的文章中会专门介绍一些主流的服务器中兼容性设置办法

微软怎么办?

作为微软公司说来,维护了一个“兼容性视图”列表,把目前没有兼容的网站放置到里面,只要用户同意接受来自微软公司更新的兼容性视图网站,那么则能够得到正确的结果。如果大家需要查看自己的网站是否在兼容性视图中,可以在IE8浏览器到地址栏里面,输入“res://iecompat.dll/iecompatdata.xml”来查看。会得到一个如下图所示的兼容性视图网站列表:

image

 

 

 

还有就是微软能够为了IE8的兼容性,做出免费的技术支持,去协助网站做好兼容性的修复工作。

posted @ 2009-07-03 16:20 月华 阅读(1172) 评论(0) 编辑
  2009年1月20日

也算是对自己去年下半年工作的一个小结,把做IE8支持的时候实现的Demo给放到这里,方便今后给客户演示时候用。

主要包括了以下内容:

1、WebSLice实现

2、加速器实现

3、简单的搜索功能

4、高级搜索功能

地址:下载

posted @ 2009-01-20 11:02 月华 阅读(81) 评论(0) 编辑

应用场景:在MIS系统中,为了给用户提供消息预警功能,如任务达到通知,因此把任务列表做成Web slice,,并用IE8订阅该Web slice,当新的任务出现后,会及时的在IE8的收藏夹工具条上通知用户。用户可以通过IE8收藏夹工具条中Web slice的预览窗口(update page)查看到自己最新的任务。

问题描述:在Windows XP和Windows Server 2003中,在收藏夹工具条中刷新Web slice,不能够找到Session和Cookie,而在Windows Vista中,则能够找到Session和Cookie的值。

因此做了一个最简单Demo(见附件),在一个页面中设置Session和cookie,在另外一个页面中建立一个Web slice,并且在该web slice中读取Session和Cookie的值。

把该Demo分别部署在Windows Server 2003+IIS6,和Windows Vista+IIS7的环境下,然后通过Windows XP、Windows Server 2003和Windows Vista等不同的操作系统去访问Demo,目前发现有以下问题。
1、能否取得Session和Cookie的值,与IIS服务器无关,只与IE8所在的客户端操作系统有关
2、在Windows XP和Windows Server 2003中,用IE去访问部署好的Demo,则找不到Session和Cookie,而在Windows Vista中,用IE去访问Demo,则能够获取正确的Session和Cookie

通过VS.NET 2008 IDE去调试,监视Session对象,发现有以下情况:
1、在Windows XP和WIndows Server 2003中,每次刷新Web Slice时,会产生一个新的Session出来,产生一个新的SessionID
2、在Windows Vista中,刷新Web Slice,直接获取到当前的Session,因此能够找到Session的值

最后通过各种渠道反馈到微软IE8的开发组那边,才被告知这是目前Beta2中存在的Bug,需要等今后正式版本出来后,才可能被修正。

如果大家要用IE8去体验它的新功能,请同时也用上微软的最新操作系统,这样效果好些,毕竟微软对新的操作系统支持的要多些。

posted @ 2009-01-20 10:53 月华 阅读(1721) 评论(0) 编辑
  2008年11月14日

    这几天,在客户那里做Virtual Earth的技术支持,需要帮助客户基于ASP.NET 3.0+Javascript+WCF+Silverlight+Ado.net data service等技术上,做地图应用,其中有一个比较有意思的问题是,自定义Shape对象的图标,几经摸索最终搞定。

场景描述:

    用户在使用程序的时候,需要添加图钉(Pushpin)、线条(Polyline)、多边形(Polygon)等到数据库里面,然后可以通过一个按钮或者其他的方式,把这些数据读取出来,显示在地图上。对于这里提到的几个图形(Shape),需要使用自定义的图标、线条及其他描述信息。

    根据MS的VE的SDK里面的文档,把这些Shape添加到数据库中,可以非常的容易实现,而且在添加的时候也容易把各种自定义的图标赋值给Shape上,也容易存储到数据库中,遇到的问题是如何取出来,并且显示到地图上去。

实现方式:

  一、VEMap.ImportShapeLayerData 

    首先,找到Virtual Earth的SDK(http://dev.live.com/virtualearth/sdk),然后里面提供了一个“Import data into shape layers”栏目,用于把成批的数据导入到地图上去,看上去用这里提供的方法可以帮助我们去完成这个要求。

   在VirtualEarth里面提供一个名为ImportShapeLayerData的方法来加入成批的数据,格式如下:

VEMap.ImportShapeLayerData(shapeSource, callback, setBestView);

    其中shapeSource可以是GeoRSS、ImportXML、VECollection,按照官方的例子,我们选择了GeoRSS的类型,通过ADO.NET DataService,生成了一个GeoRSS的文档,并且传递给这个方法,用来显示的我们的全部数据。代码如下:

function btnPolygonId_Click() {
    var request = "";
    if (document.getElementById("txtID").value != "") {
        request = "RetrieveService.svc/GetPolygon/" + document.getElementById("txtID").value;
    }
    else {        
        var num = Math.random();
        var request = "RetrieveService.svc/GetPolygon/all?num=" + num;
    }
    var layer = new VEShapeLayer();
    var layerSpec = new VEShapeSourceSpecification(
                            VEDataType.GeoRSS,
                            request,
                            layer);
    map.ImportShapeLayerData(layerSpec, onfeedload, 0);
}
         function onFeedLoad(feed)
         {
            alert('RSS or Collection loaded. There are '+feed.GetShapeCount()+
             ' items in this list.');
         }

    这时,我们去测试他,发现能够显示出来数据,但是里面自定义的图标则没有办法显示,而查看我们的服务,该服务能够数据是取正确了的,而且是符合GeoRSS的格式要求的。没有显示出来,只有求助google和baidu了,终于发现了一个帖子,是说的我们能够去在onFeedLoad事件中,可以自定义图标,代码如下:

function onfeedload(layer)
{
var numShapes = layer.GetShapeCount();
var s, n, icon;
for(var i = 0; i < numShapes; ++i)
{
     s = layer.GetShapeByIndex(i);
    
     n = i + 1;
     icon = "<img src='orange_pushpin.png'><span class='pinText'>" + " " + n + "</span>";
     s.SetCustomIcon(icon);
}
}

   这时,我们能够设置一个自定义的图标给我们的Shape,但是有个局限,所有的shape只有一个对象,郁闷之极。

二、VEMap.AddShape

    在上面的思路出现问题后,只有想其他办法。在做Shape的添加的时候,我们发现每个Shape的自定义属性都能够输入,那么我们可以把所有的Shape取出来,然后一个个都添加到地图上去,那么我们添加的时候,就可以去控制图形的属性了。

    于是,而且这个思路在Windows Live Tool For Virtual Earth中,已经测试是可以的,于是我们往这个方向去做,实现的代码如下:

function GetServerDT_CallBack(datatable)
     {
         map.DeleteAllShapes();        
         var layer = new VEShapeLayer();
         layer.SetTitle("layer01 title");
         map.AddShapeLayer(layer);
         var allpoints = new Array();
         var xmlDoc = loadXML(datatable.value);
         var shapes = new Array();
         var cnode = xmlDoc.selectNodes("//NewDataSet/Table");
         for (var i = 0; i < cnode.length; i++)
         {        
             var id = cnode[i].childNodes.item(0).text;
             var title = cnode[i].childNodes.item(1).text;
             var descption = cnode[i].childNodes.item(2).text;
             var polyline = cnode[i].childNodes.item(3).text;
             var linkurl = cnode[i].childNodes.item(4).text;
             var imgicon = cnode[i].childNodes.item(5).text;
             var indate = cnode[i].childNodes.item(6).text;
             var linepoints = polyline.split(" ");
             var thepoints = new Array();        
             for (var j = 0; j < linepoints.length / 2; j++)
             {
                 var m = j * 2;
                 var n = m + 1;
                 var arr = new VELatLong();
                 arr.Latitude = linepoints[m];
                 arr.Longitude = linepoints[n];
                 thepoints[j] = arr;
             }
         var shape= new VEShape(VEShapeType.Polyline, thepoints);
             shape.SetTitle("Enter a name to save");            
             shape.SetCustomIcon("images/target.gif");
             shape.SetDescription(descption);
             layer.AddShape(shape);
         }
         map.SetMapView(allpoints);
     }

    这个时候,代码调试正常后,运行结果发现,如果所有的图形是Pushpin时,是可以添加到地图上,如果是其他的如Polyline和Polygon时,则不能够添加到地图上,每次一循环时,把第一个Shape添加到地图上后,就出现了未处理的异常,估计是浏览器已经在写数据了,而这个时候循环还没有执行完成,矛盾了。于是这个思路也死掉了。

三、VEMap.ImportShapeLayerData 

   于是,整个项目降低要求,自定义Shape图标的功能暂时不考虑,先把成批数据取出来后,把其他功能实现了再说,好吧,我们回到了VEMap.ImportShapeLayerData 这个方法上面去,把数据显示出来,只是每个图标都是那个大大红红的图钉。

   后来在休息的时候,我尝试去看看这个Shape对象究竟是怎么回事的时候,在VEMap.ImportShapeLayerData 的onFeedLoad处理程序中,跟踪了一下获取到的Shape对象,发现了一个有趣的事情,Shape对象有两个图标相关的属性一个是“IconId”,另外一个是“IconUrl”, 我们传递过来的自定义Shape图标的数据事实上已经存在“IconID”里面,而另外一个“IconUrl”则是VE的默认图钉的地址。唉,原来这样啊,这下子比较简单了,于是在onFeedLoad事件中,重新写了一下。

function onfeedload(layer) {
    var numShapes = layer.GetShapeCount();
    for (var i = 0; i < numShapes; ++i) {
        var s = layer.GetShapeByIndex(i);
        s.SetCustomIcon(s.IconId);
    }
}

呵呵,这下子工作的非常好了。

总结

    其实,在VE6.2的SDK中,没有公布出来Shape对象的这些属性,所以我们通过调试时去跟踪,会发现有些可以用到的比较好的属性,
   1、保存时候的,我们可以通过Shape的_customIcon 属性来获取自定义图标的值,代码“var icon = map.GetShapeByID(shapeId)._customIcon ”;

   2、获取的时候,可以通过本文描述的Shape的IconId来获取

最后一句话,不要太依赖SDK中已经公布的东西了,要多进入里面去看看,说不定“柳暗花明又一村”。

posted @ 2008-11-14 16:38 月华 阅读(535) 评论(1) 编辑
  2008年11月10日

今日,有点点忙,一直在外面出差,写的东西比较少,于是把前段时间,搜集到的相关资料,做成一个列表,发到这里。

网上的资料不是太多,而且有的时候遇见问题,也不能够得到及时的支持,有点问题,纯粹是IE8.2作为测试版本,自身还没有解决的问题,所以只有大家多多交流,然后才可能更多的解决问题,为我们自己的项目加速。

我在学习过程中收集的IE8相关资料,这些资料主要是集中在MS的MSDN里面,其他地方很少。

IE8认识:
http://www.microsoft.com/china/windows/products/winfamily/ie/beta/default.mspx
IE8功能介绍:
http://www.microsoft.com/china/windows/products/winfamily/ie/beta/features.mspx
IE8安装和支持:
http://www.microsoft.com/china/windows/products/winfamily/ie/beta/support.mspx

已经实现好的新特性的集合:
http://ieaddons.com

IE兼容性资料
http://msdn.microsoft.com/zh-cn/library/cc351024(en-us,VS.85).aspx
定义文档兼容性
http://msdn.microsoft.com/zh-cn/library/cc288325(en-us,VS.85).aspx
IE兼容性中心:
http://msdn.microsoft.com/zh-cn/ie/cc405106(en-us).aspx

即使搜索:
Search Provider Extensibility in Internet Explorer
http://msdn.microsoft.com/en-us/library/cc848862(VS.85).aspx
http://www.opensearch.org/Specifications/OpenSearch/1.1

Web Slice使用和开发资料:
Web Slice Format Specification - Version 0.9
http://msdn.microsoft.com/zh-cn/library/cc304073(en-us,VS.85).aspx
IE8提供的RSS功能:
http://msdn.microsoft.com/en-us/library/cc196991(VS.85).aspx

加速器相关资料:
http://msdn.microsoft.com/zh-cn/library/cc289775(en-us,VS.85).aspx
OpenService加速器格式规范
http://msdn.microsoft.com/zh-cn/library/cc304163(en-us,VS.85).aspx
OpenService开发指南:
http://msdn.microsoft.com/en-us/library/cc287851(VS.85).aspx

管理员工具(IEAK,Internet Explorer Administration Kit 8 Beta):
http://www.microsoft.com/downloads/details.aspx?FamilyId=65033653-2721-4232-84E1-BF863631BA47&displaylang=en

IE8 开发团队博客:
http://blogs.msdn.com/ie/
IE技术中心:
http://technet.microsoft.com/en-us/ie/default.aspx

posted @ 2008-11-10 15:04 月华 阅读(257) 评论(0) 编辑
  2008年11月6日

近日坐公交车的时候,看见公交车视频里面,有两个白痴的主持人,在那里大肆鼓吹,泰拳是世界上第一厉害的武术,而且还和中国武术做了对比,我不知道这两个主持人是吃什么长大的,居然说出了这样的话。

中国武术才是真正的武术,无论是技击,还是健身表演都是最好的,中国和泰国的高手举行过了很多次比赛,好像每次都是中国这边的全胜,不知道这些主持人有没有过了解。如果她们了解了,还是这样说,只能够证明她们是NC。

引用李小龙的话,我们中国武术是世界所有武术的鼻祖。

posted @ 2008-11-06 09:23 月华 阅读(423) 评论(4) 编辑
  2008年11月5日
posted @ 2008-11-05 11:53 月华 阅读(258) 评论(0) 编辑
  2008年10月27日
posted @ 2008-10-27 10:03 月华 阅读(148) 评论(0) 编辑
  2008年10月23日
posted @ 2008-10-23 16:55 月华 阅读(263) 评论(0) 编辑