文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

apacheのURLをtomcatから取得できるようにする

apacheとtomcatを連携するシステムは多いです。


f:id:treeapps:20180418115102p:plain

apache(80) -> ajp(8009) -> tomcat(8080) という順に通信される訳ですが、SaStruts等、フレームワークによってはapacheとtomcatのURLが大幅に変わってしまう事がよくあります。

SaStrutsの例になりますが、
apacheのURLが http://localhost/test/hoge/hige?key=value として、
tomcatのURLが http://localhost:8080/test/hoge/hige?key=value となる場合、
requestから取得できる値は以下になります。

取得メソッド 取得値
request.getContextPath() /test
request.getServletPath() /hoge.do
request.getPathInfo() null
request.getPathTranslated() null
request.getRequestURL() http://localhost:8080/test/hoge.do
request.getRequestURI() /test/hoge.do
request.getQueryString() SAStruts.method=hige


oh・・・・

URIも全然違うしQueryStringにはSaStrutsが自動で付けるパラメータが勝手に入ってしまうな・・・

これは大変もどかしいうえ、apacheのURLが取得できない事に起因する余計なコードが増える事もあるでしょう。

今回はこれを解決する方法を試してみました。

apache

リクエストヘッダを利用した解決策

mod_rewriteをとRequestHeaderを使って、apacheの段階でリクエストヘッダにapache側のURIとQueryStringをセットしてしまう事で解決します。

RewriteEngine On
RewriteRule .* - [E=X_REQUEST_URI:%{REQUEST_URI}]
RewriteRule .* - [E=X_QUERY_STRING:%{QUERY_STRING}]
RequestHeader set X-REQUEST-URI "%{X_REQUEST_URI}e"
RequestHeader set X-QUERY-STRING "%{X_QUERY_STRING}e"

こう設定すると、リクエストヘッダに「x-request-uri」と「x-query-string」に値が設定されます。
この値はSaStruts側で以下のように取得します。

取得メソッド 取得値
request.getHeader("x-request-uri") /test/hoge/hige
request.getHeader("x-query-string") key=value

例えばこれの使い道として、x-quiery-stringに値が設定されている時に

<meta name="robots" content="noindex">

を付ける、等で使えます。

しかし・・・

http://localhost/test/オッスオッス/hige?key=value

という日本語URLの場合、x-request-uriには文字化けした値が設定されてしまいます。


apacheにAddDefaultCharset utf8を設定しても、tomcatにURIEncoding="UTF-8"を設定しても化けちゃうんです・・・・誰かタスケテ・・・