在Tomcat 7上安装和运行CGI Proxy Python

时间:2012-08-05 19:15:32

标签: python tomcat web-applications cgi

我想在tomcat上为openlayers设置一个代理,所以我按照以下步骤操作:

  1. 从OpenLayers网站下载proxy.cgi文件:
  2. 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应用程序的文件web.xml

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

    4. <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 / propxy.cgi?url =”;

      4. 但代理无效!当我尝试使用它时:

        /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”]有关,但我不知道它是如何相关的。

1 个答案:

答案 0 :(得分:2)

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