python - 在 Tomcat 7 上安装并运行 CGI 代理 Python

标签 python tomcat web-applications cgi

我想为 openlayers 设置在 tomcat 上运行的代理,因此我按照以下步骤操作:

  1. 从 OpenLayers 网站下载 proxy.cgi 文件:

http://trac.osgeo.org/openlayers/browser/trunk/openlayers/examples/proxy.cgi

这是代码:

#!c:/Python27/python.exe


"""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.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','localhost:6901']

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
  1. 我的 tomcat 位于端口 6901,因此我修改了 proxy.cgi 文件以将我的域包含在 allowedHosts 列表中:

    allowedHosts = ['localhost:6901']

  2. 我将 proxy.cgi 文件复制到以下文件夹:

    $TOMCAT_PATH$/webapps/myApp/WEB-INF/cgi/

  3. 通过添加文件下方的部分来修改网络应用程序的 web.xml 文件

    $TOMCAT_PATH$/webapps/myApp/WEB-INF/web.xml

<servlet> 
    <servlet-name>cgi</servlet-name> 
    <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> 
    <init-param> 
        <param-name>debug</param-name> 
        <param-value>0</param-value> 
    </init-param> 
    <init-param> 
        <param-name>cgiPathPrefix</param-name> 
        <param-value>WEB-INF/cgi</param-value> 
    </init-param> 
    <init-param> 
        <param-name>executable</param-name> 
        <param-value>c:\python25\python.exe</param-value> 
    </init-param> 
    <init-param> 
        <param-name>passShellEnvironment</param-name> 
        <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>5</load-on-startup> 
</servlet> 

<servlet-mapping> 
<servlet-name>cgi</servlet-name> 
<url-pattern>/cgi-bin/*</url-pattern> 
</servlet-mapping>

注释:“executable”参数的“param-value”必须包含 Pyhton 安装的路径。 (确实如此!)

  1. 通过添加以下元素修改了我的网络应用程序的文件 context.xml,文件位于 $TOMCAT_PATH$/webapps/myApp/META-INF/context.xml

  2. 重新启动 Tomcat

  3. 要将代理与 OpenLayers 一起使用,请在代码中包含这一行:

    OpenLayers.ProxyHost = "/yourWebApp/cgi-bin/proxy.cgi?url=";

但是代理无法工作!当我尝试使用它时:

/myApp/cgi-bin/proxy.cgi?url=labs.metacarta.com 

我收到此错误:

Some unexpected error occurred. Error text was: list index out of range

我认为它与 os.environ["REQUEST_METHOD"] 有关,但我不知道它是如何相关的。

最佳答案

问题似乎出在您的 allowedHosts 行中。它应包含您想要通过代理连接到的主机(例如 allowedHosts = ['labs.metacarta.com'])

关于python - 在 Tomcat 7 上安装并运行 CGI 代理 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819310/

相关文章:

python - 如何避免使网络服务器成为 cassandra 的瓶颈?

哈希与数字ID

python - 在 for 循环中生成时识别按钮

javax.persistence.PersistenceException : Unable to build EntityManagerFactory Tomcat 7 Spring Hibernate MS SQL

python - Tensorflow M2 Pro 故障

java - 检查客户端机器上是否有cookie,否则你做一些事情并退出

tomcat - 使用 SSL 登录 GeoServer 的问题

java.lang.NoClassDefFoundError : javax/servlet/jsp/el/ELException 错误

python - Django NoReverseMatch 错误,美元符号添加到 url 模式

python - pandas:二进制编码 pandas 列中的一组值