apacheとtomcatを連携するシステムは多いです。
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"を設定しても化けちゃうんです・・・・誰かタスケテ・・・