【问题标题】:ALLOW_ENCODED_SLASH on AWS ElasticbeanstalkAWS Elasticbeanstalk 上的 ALLOW_ENCODED_SLASH
【发布时间】:2013-06-18 09:12:51
【问题描述】:

我应该如何在 AWS 上配置我的 ElasticBeanstalk 以允许在 URL 中使用编码斜杠? (使用-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true)

我在我的源包 (http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html) 的顶级目录中创建了一个名为 .ebextensions 的目录,其中包含一个文件 tomcat.config,其内容为:

commands:
  allow-encoded-slash:
    command: export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
    cwd: /home/ec2-user

但是好像没有效果,没有出现在这些目录中:

ls -la /tmp/deployment/application/ROOT/
ls -la /var/lib/tomcat7/webapps/ROOT/ 

【问题讨论】:

    标签: tomcat amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    请注意,如果您在 tomcat 前面有一个 apache httpd,则两者都需要配置为允许斜杠

    对于 tomcat,该属性为 -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true(最好放在 tomcat conf 文件中的 CATALINA_OPTS 中)

    对于 apache,指令 AllowEncodedSlashes 需要设置为 NoDecode 此外,ProxyPass 指令需要设置为 nocanon 否则 tomcat 将收到编码斜线作为 %252F 而不是 %2F

    所以正确的apache配置是这样的:

    <VirtualHost *:80>
      ProxyPass / http://localhost:8080/ nocanon
      ProxyPassReverse / http://localhost:8080/ nocanon
      ProxyPreserveHost on
      AllowEncodedSlashes NoDecode
    </VirtualHost>
    

    【讨论】:

      【解决方案2】:

      一个 ElasticBeanstalk 在 Tomcat 前面有一个 apache(我猜是负载均衡器),所以这是第一个收到请求的,并且必须指出斜杠不能被解码。

      为了得到这个,我们使用了这个虚拟主机:

      <VirtualHost *:80>
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>
      
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
        AllowEncodedSlashes NoDecode
        LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
        TransferLog /var/log/httpd/elasticbeanstalk-access_log
      </VirtualHost>
      

      此 URL 有助于配置 EBS 和他的 apache http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html

      【讨论】:

        【解决方案3】:

        我们还尝试通过 Elastic Beanstalk 控制台中的“编辑配置”对话框设置 ALLOW_ENCODED_SLASH 系统属性。但是,尽管该属性似乎存在,但 Tomcat 仍然不允许我们使用编码斜线 (%2F)。

        我们认为 ALLOW_ENCODED_SLASH 系统属性设置正确,因为:

        1) 我们在启动 Tomcat 的 java 命令中看到该属性:

        /usr/lib/jvm/jre/bin/java -DAWS_ACCESS_KEY_ID= -DAWS_SECRET_KEY= -DJDBC_CONNECTION_STRING= -DPARAM1= -DPARAM2= -DPARAM3= -DPARAM4= -DPARAM5= -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true -Dhazelcast.native.client=true -Dcom.sun.management.jmxremote -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8765 -XX:MaxPermSize=256m -Xmx1024m -Xms256m -classpath :/usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.awt.headless=true -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat7/temp -Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
        

        2) 而且因为我们在从我们的 Web 应用程序执行此操作时也会得到“true”:

        System.getProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH")
        

        有人知道为什么 Tomcat 仍然拒绝编码斜杠吗?

        例如,此 URL 应返回一个 JSON 表示“未找到应用程序:A/1”:

        http://our-site/campaigns/application/A%2F1/udid/U1
        

        但是,相反,它说:

        在此服务器上找不到请求的 URL /v1/campaigns/application/A/1/udid/U1。

        这很奇怪,因为我们在本地 Tomcat 中尝试了 ALLOW_ENCODED_SLASH 系统属性,它工作正常。

        最近我们尝试了另一个属性。这个适用于我的本地 Tomcat 和 AWS:

        org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH
        

        我完全感到困惑... :-/

        【讨论】:

          猜你喜欢
          • 2017-08-02
          • 2014-10-20
          • 2017-01-31
          • 2014-07-06
          • 2017-09-13
          • 2014-03-08
          • 2020-04-24
          • 2021-05-19
          • 2016-09-14
          相关资源
          最近更新 更多