5

URL でエンコードされたスラッシュを許可するには、AWS で ElasticBeanstalk をどのように設定すればよいですか? (-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true を使用)

ソースバンドルの最上位ディレクトリ ( http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html ) にファイル tomcat.config を含む .ebextensions というディレクトリを作成しました。コンテンツ:

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/ 
4

3 に答える 3

1

また、Elastic Beanstalk コンソールの [Edit Configuration] ダイアログから 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 は「アプリケーションが見つかりません: 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

私は完全に困惑しています... :-/

于 2013-06-25T14:37:17.100 に答える
1

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

于 2013-06-28T22:36:11.237 に答える
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 はエンコードされたスラッシュを %2F ではなく %252F として受け取ります。

したがって、正しい apache 構成は次のようになります。

<VirtualHost *:80>
  ProxyPass / http://localhost:8080/ nocanon
  ProxyPassReverse / http://localhost:8080/ nocanon
  ProxyPreserveHost on
  AllowEncodedSlashes NoDecode
</VirtualHost>
于 2013-10-02T09:06:31.030 に答える