何するの
udzura.myudzura.com にアクセスした時はudzuraのマイページが、hoge.myudzura.com にアクセスした時はhogeのマイページが出るように、とかそういうことがしたい。
こうするの?
あらかじめ、 *.myudzura.com へのアクセスは一つのサーバに向かうようにする。
でも、今回はローカルで試したいので /etc/hosts に書いてしまった。
環境は Apache + Passenger。そう、mod_rewriteを使う。
Ubuntu Lucidで素直に「sudo aptitude install libapache2-mod-passenger」した(なんか、Karmic以前とパッケージ名も依存関係も変わってるような。。)
Railsでskel + generate controller + routes.rb等微調整して、 /etc/apache2/sites-available/default-passenger は最終的に以下のように。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <VirtualHost *:80> ServerAdmin udzura@udzura.jp DocumentRoot /home/u-kondo/dev2/mypager/public <Directory /> Options FollowSymLinks AllowOverride All </Directory> <Directory /home/u-kondo/dev2/mypager/public/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/passenger-error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel debug CustomLog /var/log/apache2/passenger-access.log combined # rewrite conf RewriteEngine On RewriteLog "/var/log/apache2/rewrite.log" RewriteCond %{HTTP_HOST} ^(.*)\.myudzura\.com$ RewriteRule ^(.*)$ $1?user=%1 [NS] </VirtualHost> |
経緯
はじめ、RewriteCondでのマッチ結果は%1~%9で取れる、ということは分かったものの、クエリを追加するのに試行錯誤していた。
何回もRewrite条件にマッチしないように [NS] と言うフラグを指定する。
RewriteRule ^(.*)$ $1?user=%1 [NS]
これだけだと、その他のQuery Stringが消えてしまう。 [QSA] と言うフラグが必要。(参考サイト)
RewriteRule ^(.*)$ $1?user=%1 [QSA,NS]
でも、逆にこれでは、ブラウザで「user=hogehoge」としてしまえば、せっかくホスト名から得た情報が上書きされてしまうのだ。
[E=Env:Var] と言うフラグで環境変数に指定出来るらしいし、そうすれば書き換えられない、と思ったら、一度設定されたら再起動されるまでずっと変化しない、、、これはCGI時代には有効だったんだろうけど、今日びのアーキテクチャでは困る。
考えられる対策は二つ。
- あえてQSAを外し、各パラメータはPATH側に含まれるようroutes.rbを設定する(
map.mypage_foo_bar 'mypage/:foo/:bar'みたいなの) - 上書き可能なことを仕様にする。
後者はセキュリティとかどうなんだという感じもする(例えば、自分のページのつもりで他人のページを編集できるような セキュリティホールの原因にならないか)。
あと、そもそもRailsなら、
request.hostで HTTP_HOST が取得できるじゃないか! って途中で気づいたので、filterとかでそこを見て振り分ければいいのではないか。でもね、mod_rewriteの方が絶対高速だもの。。
結論
- Module mod_rewrite URL Rewriting Engine を機会があれば熟読しておくと、幸せになれる可能性が上がる
- そもそもmod_rewriteの設定で遊びまくってアプリケーション側開発の時間が。。。ってのは本末転倒だと思う




