将Openlayers proxy.cgi与Fedora一起使用



我正试图将我的应用程序从Windows服务器移动到Fedora服务器。我的问题是我使用proxy.cgi从geoserver获取信息。在将proxy.cgi移动到Fedora后,我应该如何编辑它?

我试过

#!/usr/bin/python

并且它仍然只返回纯文本。

这是我的代理.cgi代码:

#!/usr/bin/python -u
"""This is a blind proxy that we use to get around browser
restrictions that prevent the Javascript from loading pages not on the
same server as the Javascript.  This has several problems: it's less
efficient, it might break some sites, and it's a security risk because
people can use this proxy to browse the web and possibly do bad stuff
with it.  It only loads pages via http and https, but it can load any
content type. It supports GET and POST requests."""
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

需要设置Web服务器以执行.cgi脚本。

请参阅:http://httpd.apache.org/docs/current/howto/cgi.html

示例(Apache:);

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

我还应该指出,CGI并不是Python中真正推荐的方法。请考虑以下其中一项:

  • WSGI(http://wsgi.readthedocs.org/en/latest/)
  • Web框架(有许多可供选择

正如OP下面的评论所指出的(没有sudo/root访问服务器)你唯一的其他选择是用合适的web框架构建一个简单的web应用程序并使用类似wsgi2cgi 的东西包装CGI

以下是使用circuits.web 的示例

你好.cgi:

#!/usr/bin/env python
print "Contnt-Type: text/html"
print
print "Hello World!"

cgiwrapper.py(服务器):

#!/usr/bin/env python
from wsgi2cgi import CGI
from circuits.web import Server
from circuits.web.wsgi import Gateway

def app(environ, start_response):
    wrapper = CGI("hello.cgi")
    return wrapper.application(environ, start_response)

server = Server(("0.0.0.0", 5000))
Gateway({"/": app}).register(server)
server.run()

示例输出:

$ curl -q -o - http://localhost:5000/
Hello World!

这将不需要root/sudo访问服务器,但您被限制在非专用端口上运行(>1024)。

最新更新