posts - 41,  comments - 90,  trackbacks - 0
openlayers是一个纯javascript的web地图客户端框架,对开发平台的适应性非常强,可以很容易的嵌入静态http页面、asp页面、.net页面、jsp页面、j2ee页面。由于openlayers采用AJAX架构,当地图服务器与web客户端服务器不同时,WMS中的getFeatureInfo,以及所有WFS功能接口不能正常工作。原因是各种浏览器禁止跨域访问xml,解决的办法很简单,使用代理(Proxy)。

根据应用系统架构的不同,代理的实现方式有很多种,包括web服务器内置代理(如Apache)、cgi方式代理、php代理、jsp代理、aspx代理等。
openlayers官方提供了一个采用python编写的cgi代理,推荐在Apache2.2下使用。

openlayers官方代理安装步骤:
1、安装Python2.5,记住安装路径。
2、将openlayers官方提供的proxy.cgi复制到apache的cgi-bin目录下。
修改第一行Python25的安装路径,注意不要去掉最前面的#号。
修改allowedHosts中的geoserver/mapserver ip:geoserver/mapserver port部分。
3、打开conf目录下的httpd.conf文件,修改cgi部分,例如:
<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
AddHandler cgi-script .cgi .py
保存后重新启动Apache,在浏览器地址栏中填入http://apache ip/cgi-bin/proxy.cgi,测试代理是否工作正常。

以下是proxy.cgi的内容:
#!C:\Python25\python.exe
# -*- coding: utf-8 -*-

import urllib2
import cgi
import sys, os

# Designed to prevent Open Proxy type stuff.

allowedHosts = ['geoserver/mapserver ip:geoserver/mapserver port',
                                'www.openlayers.org',
                                'openlayers.org']

method = os.environ["REQUEST_METHOD"]

if method == "POST":
    qs = os.environ["QUERY_STRING"]
    d = cgi.parse_qs(qs)
    if d.has_key("url"):
        url = d["url"][0]
    else:
        url = "http://www.openlayers.org"
else:
    fs = cgi.FieldStorage()
    url = fs.getvalue('url', "http://www.openlayers.org")

try:
    host = url.split("/")[2]
    if allowedHosts and not host in allowedHosts:
        print "Status: 502 Bad Gateway"
        print "Content-Type: text/plain"
        print
        print "This proxy does not allow you to access that location (%s)." % (host,)
        print
        print os.environ
 
    elif url.startswith("http://") or url.startswith("https://"):
  
        if method == "POST":
            length = int(os.environ["CONTENT_LENGTH"])
            headers = {"Content-Type": os.environ["CONTENT_TYPE"]}
            body = sys.stdin.read(length)
            r = urllib2.Request(url, body, headers)
            y = urllib2.urlopen(r)
        else:
            y = urllib2.urlopen(url)
      
        # print content type header
        i = y.info()
        if i.has_key("Content-Type"):
            print "Content-Type: %s" % (i["Content-Type"])
        else:
            print "Content-Type: text/plain"
        print
      
        print y.read()
      
        y.close()
    else:
        print "Content-Type: text/plain"
        print
        print "Illegal request."

except Exception, E:
    print "Status: 500 Unexpected Error"
    print "Content-Type: text/plain"
    print
    print "Some unexpected error occurred. Error text was:", E

备注:部署在同一个机器、不同服务器上(相同ip,不同端口号)同样是跨域访问。例如地图服务器geoserver在tomcat,端口8080,应用系统在Apache或IIS,端口80),这种情况下只有IE6能够正常访问,条件是将ip地址加入可信站点列表,IE7、IE8、FF3.6都会禁止访问。


posted on 2010-08-26 10:36 天狼 阅读(4107) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: