質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

2809閲覧

Apacheのリバースプロキシを経由したリクエストの元々のRequestURLを取得したい

fsk5303

総合スコア21

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

3クリップ

投稿2018/11/22 05:39

編集2018/11/22 05:42

前提・実現したいこと

Apacheのリバースプロキシを経由したリクエストの元々の(書き換え前の)RequestURLやRequestURIを取得したい。

(例)ユーザーが「http://my-app.com/test/url」にアクセスしてきた際、下記コード等にて「http://my-app.com/test/url」の文字列を取得したい。

Java

1String requestURL = new String(request.getRequestURL());

発生している問題・エラーメッセージ

①Apache httpd.confにて以下のプロキシ設定を行う。

ProxyPass /test/url ajp://○○○.○○○.○○○.○○○:○○○○/TestApp/ ProxyPassReverseCookiePath /TestApp /test/url/ ProxyPassReverse /test/url ajp://○○○.○○○.○○○.○○○:○○○○/TestApp/

②Servlet内で以下の処理を行う。

String requestURL = new String(request.getRequestURL());

③「http://my-app.com/test/url」へアクセスする。

取得したい文字列:http://my-app.com/test/url 実際に取得されてしまう文字列:https://○○○.○○○.○○○.○○○/TestApp/

試したこと

①Apache httpd.confに以下のような記述を追加

#追記1 RequestHeader set TestHeader "TestHeaderValue" #追記2 RewriteEngine On #追記3 RewriteCond %{REQUEST_URL} (.*) RewriteRule .* - [E=X_REQUEST_URL:%1] RequestHeader Set X-Request-URL %{X_REQUEST_URL}e #追記4 RewriteCond %{REQUEST_URI} (.*) RewriteRule .* - [E=X_REQUEST_URI:%{REQUEST_URI}] RequestHeader Set X-Request-URI "%{X_REQUEST_URI}e" #追記5 ProxyPreserveHost On

②Servlet内で以下の処理を追加

java

1System.out.println("TestHeader :" + request.getHeader("TestHeader")); 2System.out.println("X-REQUEST-URL :" + request.getHeader("X-REQUEST-URL")); 3System.out.println("X-REQUEST-URI :" + request.getHeader("X-REQUEST-URI"));

③出力結果

// 正しくヘッダに追加され、値が取得できている。 TestHeader :TestHeaderValue // 値が「(null)」となってしまう X-REQUEST-URL :(null) // 値が「(null)」となってしまう X-REQUEST-URI :(null)

調べると、上記の方法でRequestURIやRequestURLが取得出来ているという記述が見つかるのですが、
望んでいる動作となりません。
アドバイス頂けると幸いです。
質問に不備等ありましたら修正致しますので、ご指摘お願い致します。

補足情報(FW/ツールのバージョンなど)

・CentOS 7.4.1708
・Apache Httpd 2.4.6
・Tomcat 9.0.5
・OpenJDK 1.8.0_151

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サーブレット仕様の何となく気になるところではあるんですが…

Apache HTTPD側でヘッダ名をキャメルケースにしても、大文字だけにしても、HttpServletRequest#getHeader(headerName) の headerName には、全部小文字を指定してください。OS依存なのかもしれませんが、例えばサーブレットでHTTPヘッダと値の一覧を取得すると、以下の内容になります。

json

1{ 2 accept-language: "ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7", 3 dnt: "1", 4 x-forwarded-for: "127.0.0.1", 5 accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 6 x-forwarded-server: "localhost", 7 x-forwarded-host: "127.0.0.1", 8 x-query-string: "", 9 host: "127.0.0.1:8080", 10 upgrade-insecure-requests: "1", 11 x-request-uri: "/senjin", 12 connection: "Keep-Alive", 13 cache-control: "max-age=0", 14 accept-encoding: "gzip, deflate, br", 15 user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" 16}

この時にリクエストしたURLは http://127.0.0.1/senjin で、
リバースプロクシ設定は、以下の状態です。

ProxyPass /senjin http://127.0.0.1:8080/ ProxyPassReverse /senjin http://127.0.0.1:8080/

解決できなかったらすみません(´・ω・`)

投稿2018/11/22 10:52

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fsk5303

2018/11/26 08:25

ご回答ありがとうございました。 httpd.confにプロキシの設定と共に後述の設定を行い、ヘッダに独自の値を設定したうえで、 FilterクラスのdoFilter()メソッド内でHttpServletRequestクラスのgetRequestURI()メソッドをオーバーライドする事で、一応プロキシ経由前のリクエストURIを取得する事が出来ました。 # httpd.confの設定 SetEnvIf REQUEST_URI "^(.*)$" X-Request-Uri=$1 RequestHeader set X-Request-Uri "%{X-Request-Uri}e" プロキシの設定等大変参考になりました! 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問