2013-06-21 3 views
4

Как настроить мой ElasticBeanstalk на AWS, чтобы разрешить кодированные косые черты в URL-адресах? (Использование -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = истина)ALLOW_ENCODED_SLASH на AWS Elasticbeanstalk

Я создал директорию .ebextensions с файлом tomcat.config в каталоге верхнего уровня моего исходного пучка (http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html) с содержанием:

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/ 

ответ

1

ElasticBeanstalk имеет апач (я думаю, для Балансировщика нагрузки) на передней панели Tomcat, так что это первый, кто получает запрос, и где должно быть указано, что косые черты не должны декодироваться.

Для того, чтобы получить это, мы использовали этот VirtualHost:

<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 и его апача http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html

1

Мы также попытались установить системное свойство ALLOW_ENCODED_SLASH через диалог Edit Configuration в Эль астероидная консоль Beanstalk. Но, хотя свойство, кажется, присутствует, 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 должен возвращать JSON говоря "Приложение не найдено: А/1":

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

Но, вместо этого, он говорит:

Запрошенный URL/v1/кампании/application/A/1/udid/U1 не найден на этом сервере.

Странно, потому что мы попробовали свойство системы ALLOW_ENCODED_SLASH в локальном Tomcat, и оно отлично работает.

В последнее время мы попробовали другое имущество. Это те, работают как в моем локальном сервере Tomcat и в AWS:

org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH 

Я совершенно озадачен ...: -/

0

Заметьте, что если у вас есть, Apache HTTPD перед кота должны быть сконфигурированы так, чтобы разрешать косые черты

для tomcat это свойство -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = истина (лучше всего поместить в CATALINA_OPTS в файле Tomcat конф)

для апача в директиве AllowEncodedSlashes должен быть установлен NoDecode , кроме того, директива ProxyPass должен быть установлен в nocanon иначе кот будет выслана кодированный слэш как% 252F вместо% 2F

Так правильная конфигурация Apache выглядит следующим образом:

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