URL からファイルシステム上の位置へのマップ - Apache HTTP サーバ を参考に
userdir と組合せてチルダを消せるようなRewriteパターンを纏めた
/etc/passwd に存在しないユーザーでもマッチするような感じ
Alias で強制マッチさせる
AliasMatch ^/users/([a-zA-Z0-9]+)/?(.*) /home/$1/public_html/$2
Rewrite でマッピングする
RewriteEngine on RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3
なのとか
replace /~user by the canonical /u/user and fix a missing trailing slash for /u/user.
チルダを別文字列を置換して使う.
Rewriteでかき変えて,~以外の文字列にして、チルダを隠しておく
Rewriterule ^/u/([a-zA-Z0-9]+)/(.*) /~$1/$2 [PT] Rewriterule ^/u/([a-zA-Z0-9]+)$ /u/$1/ [L,R]
2行あるのは末尾のスラッシュ対応
ドメイン名をFakeしてユーザー名を入れる
チルダの代わりに、ドメイン名にユーザー名を入れる
user.example.com で example.com/~user/ に変換
RewriteEngine on RewriteCond %{HTTP_HOST} !^www\.example\.com$ RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.com$ RewriteRule ^/(.*)$ /~%1/$1 [PT]
mod_rewriteでPerlを呼び出してそっちで書換えるとか
強引にPerlを使っている
http://www7b.biglobe.ne.jp/~lunlumo/bibo/non_tilde.htmlRewriteEngine on RewriteLogLevel 0 RewriteLog logs/rewrite.log RewriteMap non-tilde-user prg:/home/rewrite_script.pl RewriteRule ^/([^~/]+)/(.*)$ ${non-tilde-user:$1|nobody}/$2
おまけ拡張子の書き換えとか
RewriteEngine on RewriteBase /~quux/ RewriteRule ^foo\.html$ foo.cgi [T=application/x-httpd-cgi]
mod_rewrite について
mod_rewrite はApacheがディレクトリとURLをマッピングする動作に割り込んで処理をする。
だけど、directory や、Locationや .htaccess にRewriteを設置するのでややこしい.
書き換えは,Rewriteのルールが記述された箇所で実行される.
おおざっぱに言うと
リクエストURL→マッピング→ディレクトリ読込→Rewriteハッケン→Rewrite実行。(ここで書換えたURLを元に再度マッピングする)