如何在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/
答案 0 :(得分:1)
我们还尝试通过Elastic Beanstalk控制台中的Edit Configuration对话框设置ALLOW_ENCODED_SLASH系统属性。但是,虽然该属性似乎存在,但Tomcat仍然不允许我们使用编码斜杠(%2F)。
我们认为ALLOW_ENCODED_SLASH系统属性已正确设置,因为:
1)我们在java命令中看到启动Tomcat的属性:
/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)因为从我们的网络应用程序执行此操作时我们也得到“真实”:
System.getProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH")
有谁知道为什么Tomcat仍然拒绝编码的斜杠?
例如,此URL应返回一个名为“找不到应用程序:A / 1”的JSON:
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
我完全不解......: - /
答案 1 :(得分:1)
ElasticBeanstalk在Tomcat前面有一个apache(我猜对于Load Balancer),所以这是第一个接收请求的人,必须指出斜杠必须不被解码。
为了得到这个,我们使用了这个虚拟主机:
<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>
此网址有助于配置EBS及其apache http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html
答案 2 :(得分:0)
注意,如果你在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>