15

現在、Javaサーブレットを提供するためのTomcat +ApacheHTTPサーバー設定があります。

ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice

クライアントのIPアドレスを知る必要があることを除いて、これはすべて問題myserviceありません。クライアントのIPアドレスは、プロキシのために常に127.0.0.1であることがわかります。実際のIPアドレスを取得するための解決策はありますか?AJPはオプションですか?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
4

3 に答える 3

23

次のようにします。

Apache構成で:

<Location /foo>
  ProxyPass ajp://localhost:8009/foo
  ProxyPassReverse ajp://localhost:8009/foo
</Location>

そして、あなたのserver.xmlで:

<Connector port="8009" 
           enableLookups="false" secure="true" URIEncoding="UTF-8"
           tomcatAuthentication="false"
           protocol="AJP/1.3" />

それはすべてを通過するはずです。AJP プロトコルは情報を渡しますが、http: は渡しません。

SSL は apache レイヤーで処理され、接続が安全なものと見なされる必要があることを tomcat が知る必要があるため、secure="true" を使用したくない場合があります。

于 2009-07-25T02:47:02.310 に答える
5

X-Forwarded-Forはリクエストヘッダーで読み取ることができます。

Apache mod_proxyドキュメントから:

リバースプロキシモードで動作する場合(たとえば、ProxyPassディレクティブを使用する場合)、mod_proxy_httpは、オリジンサーバーに情報を渡すためにいくつかの要求ヘッダーを追加します。これらのヘッダーは次のとおりです。

  • X-Forwarded-For:クライアントのIPアドレス。
  • X-Forwarded-Host:HostHTTPリクエストヘッダーでクライアントによってリクエストされた元のホスト。
  • X-Forwarded-Server:プロキシサーバーのホスト名。

元のリクエストにすでにこれらのヘッダーの1つが含まれている場合、これらのヘッダーには複数の(カンマ区切りの)値が含まれるため、オリジンサーバーでこれらのヘッダーを使用する場合は注意が必要です。たとえば、オリジンサーバーのログ形式の文字列で%{X-Forwarded-For} iを使用して、元のクライアントのIPアドレスをログに記録できますが、リクエストが複数のプロキシを通過する場合、複数のアドレスを取得する可能性があります。

サーブレットには、次のものがあります。

doGet(HttpServletRequest request, HttpServletResponse response){
  request.getHeader("X-Forwarded-For")
}
于 2012-12-02T21:36:47.617 に答える
1

これは非常に簡単です:

<VirtualHost> 

 ServerName www.server.com

 redirect / http://www.server.com/foo

 ProxyRequests off
 ProxyPass / ajp://localhost:8009/

</VirtualHost>
于 2010-12-13T08:25:25.600 に答える