何するの

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の設定で遊びまくってアプリケーション側開発の時間が。。。ってのは本末転倒だと思う