バーチャルホスト+サブドメイン+リライト

※書いている人はサーバや正規表現に詳しくないので注意。

http://hoge.example.jpへのアクセスをhttp://hoge.example.jp?id=hogeにする。
サーバはapatche、リライトルールは.htaccessに書いた。
本当はhttp.confに書くべきなんだけど、編集不可という環境でした。


まずapacheの対象ディレクティブのServerAliasを「*.example.jp www.example.jp」にして再起動。
これがないと403エラーが出まくってた。


次に.htaccessにリライトルールを書く。

RewriteEngine on


#コンテンツページ【hoge.example.jp/1】→【www.example.jp/page.php?id=hoge&no=1】
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.jp
RewriteRule ^([0-9]+?)$ /page.php?id=%1&no=$1 [L]


#index.phphoge.example.jp】→【www.example.jp/?id=hoge
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.jp
RewriteRule !^(.+?)$ /index.php?id=%1 [L]

こんな感じでリライト。


ちなみにPHPで作った携帯サイトだったのでセッションIDをURLに手動で付加していたんだけれど、

RewriteRule ^([0-9]+?)\?SESSIONID=([a-zA-Z0-9]+?)$ /page.php?id=%1&no=$1&SESSIONID=$2 [L]

どうしても出来なかった。

どうやらRewriteRuleはクエスチョンマーク(?)以降をクエリーと見なし、リライトの対象外にするみたい。
よってクエスチョンマーク以後は利用不可。

そんなことは全然なくて、{QUERY_STRING}で取得可能だった。
ていうかセッションIDはPHP側で自動付加してくれるから何も手動でする必要はなかったっていう。っていう。

PHPの「use_trans_sid=0」でURLに付加されるSESSIONIDについて

前述のリライトルールではURLに付加されたSESSIONIDが欠けてしまい、ページ遷移毎に新しいセッションが張られてデータの維持ができなくなってしまう。
修正版がコチラ。

RewriteEngine on


#コンテンツページ【hoge.example.jp/1?SESSIONID=fuga】→【www.example.jp/page.php?id=hoge&no=1&SESSIONID=fuga】
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.jp
RewriteRule ^([0-9]+?)$ /page.php?id=%1&no=$1&%{QUERY_STRING} [L]


#index.phphoge.example.jp/?SESSIONID=fuga】→【www.example.jp/?id=hoge/SESSIONID=fuga】
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.jp
RewriteRule !^(.+?)$ /index.php?id=%1&%{QUERY_STRING} [L]

%nとか$nとか

  • %n
    • RewriteCondのn番目のパッチパターンの値
  • $n
    • RewriteRuleのn番目のパッチパターンの値

RewriteRuleの!^(.+?)$

先頭から(任意の一文字と1回以上一致)末尾まで の否定

HTTP_HOST(http://www.example.jp/)以降に何も付いていない場合