2017-05-24 5 views
0

Apache 2.4とTomcat 7を実行している新しいマシンにwebappのバージョンを設定しているため、ログインできません。現在のサイトはApache 2.2およびTomcat 6上で動作しています。Apache 2.4(ただし2.2ではない)のTomcat/AJPでのPOSTパラメータに関する問題

デバッグでは、request.getParameter()が2.4サイトのみでnullを返していることが示されています。

これはすべてのブラウザでチェックして、サイトを操作するので、AJPは少なくとも部分的に機能します。フォームデータが私のTomcatには見えないというフォームを投稿するときだけです。

構成の両方で同じである。

として
<VirtualHost *:80> 
    ServerName  www.example.com 
    ServerAlias  example.com 
    ServerAlias  cdn.example.com 
    ServerAlias  prod.example.com 

    ProxyPreserveHost On 
    ProxyPass /images/ ! 
    ProxyPass /font/ ! 
    ProxyPass /style/ ! 
    ProxyPass/ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On 
    ProxyPassReverse/ajp://localhost:8009/ 

そしてserver.xmlの定義におけるコネクタ:

<Connector port="8009" address="localhost" 
      maxThreads="250" minSpareThreads="5" maxSpareThreads="15" 
      connectionTimeout="200000" 
      packetSize="16384" 
      maxHttpHeaderSize="16384" 
      enableLookups="false" redirectPort="8443" 
      emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/> 

ブラウザリクエストヘッダである:

Host: prod.example.com 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: es,sv;q=0.9,de;q=0.8,en;q=0.6,es-MX;q=0.5,en-AU;q=0.4,ja;q=0.3,fr;q=0.1 
Accept-Encoding: gzip, deflate, br 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 73 
Referer: http://prod.example.com/en_US/auth/login.action 
Cookie: JSESSIONID=07FB9E1A02A4464C0D65B332B53EF02F 
Connection: keep-alive 
Upgrade-Insecure-Requests: 1 

Iが有効ポート8080経由で直接Tomcatにアクセスし、ログインもこの方法でうまく動作します。

コードは同じgit repoとブランチから来ているので、他のものはすべてレガシーサイトと同一である必要があります。これを追跡するためにTomcat 7またはApache 2.4の変更を調べるべきですか?

更新:投稿するように設定された非常に単純なtest.jspを作成しました。私は使用します...

Enumeration paramNames = request.getParameterNames(); 
while (paramNames.hasMoreElements()) { 
    String name = (String) paramNames.nextElement(); 
    String[] values = request.getParameterValues(name); 

..パラメータをダンプします。直接8080のURLを介して、これは完全に動作しますが、Apache/AJPを介してすべてのPOSTパラメータは無視されますが、手動でGETパラメータをURLに追加すると例: ?test=123これらはうまく動作します。

アップデート2:私は私のtest.jsprequest.getReader()の出力を追加しましたし、私のPOSTデータは、例えば、正しくそこに表示されますt1=Some+text&t2=Testingでも、request.getParameter("t1")はまだnullです。私は本当にばかげた何かを逃しているに違いない。

アップデート3:私はもともとこれは、SSLは、関連するが、今非SSLのVirtualHostを設定していると、これは正確に同じ問題を抱えていると思いました。私のテストページには日付スタンプがあるので、キャッシュの問題ではないようです。

更新4:私はちょうど、フォームのPOSTデータを正しく処理することを可能にする、以下の変更作ら:だから

# ProxyPass/ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On 
# ProxyPassReverse/ajp://localhost:8009/ 
ProxyPass/http://localhost:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On 
ProxyPassReverse/http://localhost:8080/ 

を、これは、ApacheやTomcatのバグのように見えますか?

答えて

1

あなたのPOST本体にはいくつのアイテムがありますか? Tomcatには最大数があります。 Tomcat 7のデフォルト値は10,000です。いくつかのパラメータがありますが、AJPは設定可能ではありません。両方のために、以下を参照してください。http://tomcat.10.x6.nabble.com/Tomcat-looses-POST-parameters-td2067515.html

https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

あなたの質問については、この記事では、それはAJP(著者の結論は、それはTomcatのことだったが)であることを、徹底的なテストの後、示唆しているようです。本質的には、データはAJPに入っていて、Tomcatの最初のフィルタには表示されませんでした。

HTTPを使用してProxyPassを使用しない理由は何ですか?

+0

これは小さなデータパケット、つまり入力テキストが数文字のフォームにも適用されます。 AJP経由でフォームデータを正しく処理していないTomcatのようですが、バイトは依然として 'request.getReader'で利用可能です。 –

+0

パフォーマンス上の理由からAJP(HTTP経由)でProxyPassを使用したかったのです。 –

関連する問題