mod_rewriteでauガラケーのSSL対応しようとしたら見事にハマった件について

このエントリーをはてなブックマークに追加
お久しぶりでございます、インフラ担当のfujya.shです。
最近暑いですね、ホント嫌になっちゃいます。最近はプライベートでIX2015を2台貰ったので、ちょっと遊んでみようかと思っております。


IPsec 高速化拡張ソフトウェアセット入れるとIPsecが爆速になるという噂のIX2015たん。








とある事から「ガラケーからSSLのサイト見れるよーにしてくれない?」という話が来まして、軽い気持ちで対応しようとしたら様々な障壁があり、大変だったので今回は解決までの道のりを紹介しようかと思います。



■auガラケーはRequestHeaderのHostに:443付けてリクエストしてくる輩がいる

auの一部ガラケーではhttps://~のサイトを閲覧する際に、リクエストヘッダのHostの末尾に:443をつけてアクセスしてくる事があります。(手元の検証端末W63CAではついてきました)


こんなアクセスログが入ってきます(HTTP_HOSTがexample.com:443になっちゃってる)
10.8.15.100 - - [29/May/2011:17:48:30 +0900] "GET /path/to/sample/test?lang=ja
HTTP/1.1" 200 2547 "" "KDDI-CA3C UP.Browser/6.2_7.2.7.1.K.2.232 (GUI) MMP/2.0"
281408 example.com:443

これでは環境変数の %{HTTP_HOST} が :443 付いてしまうので、アプリケーションが%{HTTP_HOST} を利用している箇所がある場合は正常に動作しない可能性があります。mod_rewriteで %{HTTP_HOST} が ^.*:443$ にマッチした場合に
%{HTTP_HOST} から :443 を消し去る処理を施してあげる必要がありそうです。

それではmod_rewriteで ${HTTP_HOST} を書き換えてみましょう。



■mod_rewriteで%{HTTP_HOST}の書換ができない
さっそくmod_rewriteでRewriteCondとRewriteRuleを書いてみましょう。
RewriteCond %{HTTP_HOST} ^(.*):443$
RewriteRule .* - [E=HTTP_HOST:%1]
これで%{HTTP_HOST}が:443抜きのものに書き換わっているハズです。

確認作業に入ります。
Apacheのコンフィグに下記コンフィグを追加してHTTP_HOSTの状態を確認してみましょう。
CustomLog logs/env_log "%t %h HTTP_HOST=%{HTTP_HOST}e"
configtestして、SyntaxがOKならrestart||gracefulします。そしてアクセスしてenv_logを見てみましょう。

[1/Apr/2011:12:00:00 +0900] 10.8.15.100 HTTP_HOST=example.com:443

%{HTTP_HOST}がexample.com:443のままです。何故でしょうか??


「環境を操作するディレクティブを使って標準CGI変数を上書きしたり変更したりすることはできません。」

と書いてありました。
標準CGI変数とは何かとさらに調べてみるとRFC3875で定義されているCGIが利用するメタ変数の事だそうです。つまり、標準的な環境変数は書換が出来ないという事になります。



■%{X_HTTP_HOST}を宣言してしまう方法

回避策として複数ありますが今回は別途、独自環境を宣言し回避することにしました。
RewriteCond %{HTTP_HOST} !^(.*):443$
RewriteRule .* - [E=X_HTTP_HOST:%{HTTP_HOST}e]
RewriteCond %{HTTP_HOST} ^(.*):443$
RewriteRule .* - [E=X_HTTP_HOST:%1]
%{HTTP_HOST}の末尾に:443がついていてもついていなくても、
%{X_HTTP_HOST}という独自環境変数に:443抜きのモノが入るように宣言しています。

それでは早速確認してみましょう。先程のenv_logのコンフィグを下記の通り修正します。
CustomLog logs/env_log "%t %h X_HTTP_HOST=%{X_HTTP_HOST}e"
コンフィグを変更したら必ずconfigtestしてからrestart||gracefulです。OKが返ってきたらアクセスしてみましょう。

[1/Apr/2011:12:15:31 +0900] 10.8.15.100 X_HTTP_HOST=example.com

:443がついていない%{X_HTTP_HOST}という環境変数が生成されていることが確認できました。
後はアプリケーション側で%{HTTP_HOST} -> %{X_HTTP_HOST}に切り替えてもらう作業をする事で無事解決といった形になります。



■番外編1:mod_rewriteで独自の環境変数を利用する場合はご注意を

mod_rewriteのRewriteCond/RewriteRuleで使用する環境変数は限定されています。mod_rewriteで独自の環境変数を利用するときは%{ENV:環境変数}で宣言しないといけません。

#例えば%{X_HTTP_HOST}をパスの先頭に入れる場合は
RewriteCond %{HTTP_HOST} !^(.*):443$
RewriteRule .* - [E=X_HTTP_HOST:%{HTTP_HOST}]
RewriteRule ^/path/to/ /%{ENV:X_HTTP_HOST}e/path/to/
普通に%{X_HTTP_HOST}eでrewriteしようとしてもできないので、ENV:を付けてあげましょう。


番外編2:ガラケーのSSL対応状況にご注意を

ガラケーにインストールされているルート証明書に関しては端末ごと・発売時期によって全然対応状況が変わってきます。
各証明局で携帯電話のSSL対応状況が書いてあるので、ガラケー対応する場合には確認が必要です。





手元の検証端末と検証用サイトのSSLが対応して無く(au W63CA × グローバルサイン)アクセスすることすらできず、検証するのにとても手こずりました。


■まとめ:ガラケェ・・・

とにかくガラケーは文字コード・SSL周り・HTML対応状況・独自仕様等々の制約が山のようにあり、全ての端末に対応させようと思ったら気が遠くなるほど時間と労力が必要だと体感しました。

他の国がどうなのか分かりませんが、ガラケーの独特の仕様に対応するための時間って凄い無駄なワケで、こういったモノが氾濫してる日本は国家レベルでの競争力低下につながってるんじゃないかと。
良いモノ作りたい人がこういうった制約が足かせになって、機能開発などに時間が使えないのは不幸だと思うわけです。

もし、この記事を呼んで「参考になった!」と思ってくれる人が居て、ガラケー対応の為の時間が省けて良いものを作る時間に1秒でも多く費やしてもらえたら幸いです。
ガラケーはホビロン!!!
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...