一位用户在使用 Openlayers 库时遇到问题,具体问题是当他将应用从 Windows 服务器迁移到 Fedora 服务器后,在使用 proxy.cgi 获取 geoserver 信息时,它只会返回纯文本而不是所需的内容。这是因为用户需要修改 proxy.cgi 中的部分代码才能在 Fedora 中正常运行。
2、解决方案
为了解决这个问题,用户需要确认 web 服务器已经配置好能够执行 .cgi 脚本。还可以考虑使用更推荐的 Python 方法,例如 WSGI 或 web 框架。
如果用户没有 root/sudo 权限访问服务器,则可以使用 wsgi2cgi 之类的工具来包装 CGI,无需 root/sudo 权限即可运行。
以下是具体步骤:
- 将 proxy.cgi 脚本复制到 Fedora 服务器上的合适位置。
- 编辑 proxy.cgi 脚本,确保以下内容:
#!/usr/bin/python -u
- 确保 web 服务器配置正确,可以执行 .cgi 脚本。
- 如果没有 root/sudo 权限访问服务器,则可以使用 wsgi2cgi 之类的工具来包装 CGI。
- 重新启动 web 服务器。
- 现在,proxy.cgi 应该能够在 Fedora 中正常运行,并可以正确地从 geoserver 获取信息。
代码例子
以下是在 Fedora 中正确运行 proxy.cgi 的代码示例:
#!/usr/bin/python -u
import urllib2
import cgi
import sys, os
# Designed to prevent Open Proxy type stuff.
allowedHosts = ['www.google.co.id','www.openlayers.org', 'openlayers.org',
'labs.metacarta.com', 'world.freemap.in',
'prototype.openmnnd.org', 'geo.openplans.org',
'sigma.openplans.org', 'demo.opengeo.org',
'www.openstreetmap.org', 'sample.azavea.com',
'v2.suite.opengeo.org', 'v-swe.uni-muenster.de:8080',
'vmap0.tiles.osgeo.org', 'www.openrouteservice.org', '172.20.32.11:8080', '172.20.32.11','localhost',
'localhost:8080',
'http://192.168.64.2:8080', 'http://192.168.64.2']
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