문제

I am trying to move my application into Fedora server from my Windows server. My problem is that I use proxy.cgi to get information from geoserver. How should I edit proxy.cgi after I move it into Fedora?

I have tried

#!/usr/bin/python

and it still only return plain text.

This is my proxy.cgi code:

#!/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
도움이 되었습니까?

해결책

Your webserver needs to be setup to execute .cgi scripts.

See: http://httpd.apache.org/docs/current/howto/cgi.html

Example (Apache:);

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

I should also point out that CGI is not really the recommend approach in Python. Please consider one of the following:

As noted by the OP's comments below (no sudo/root access to the server) your only other option is to build a simple web app with a suitable web framework and wrap the CGI using something like wsgi2cgi

Here is an example using circuits.web

hello.cgi:

#!/usr/bin/env python

print "Contnt-Type: text/html"
print
print "Hello World!"

cgiwrapper.py (server):

#!/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()

example output:

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

This would not require root/sudo access to the server; but you are restricted to running on non-priveleged ports (>1024).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top