XAMPPのVirtualHost設定で沼った話
phpで作成したサイトをローカル環境でテストしたい場合、
XAMPPを使うと必要なソフトウェアがまとめて管理出来て便利だが、
デフォルトだと、/xampp/htdoc/以下にしかサイトを定義できず、
複数サイトを運用している場合、$_SERVER['DOCUMENT_ROOT']がずれてしまうなど、
不便なことがある。
VirtualHostという機能を使うことでこの問題は解決できるが、
ネットに転がっている情報だけではうまく動作せず、
見事に沼ってしまったので、メモを残しておく。
答えにたどり着いた大きな要因はエラーログを参照したことであると感じる。
C:/xampp/htdocs/test1/
をルートとして設定したにもかかわらず、
https://test1/ にアクセスするとhtdocs/ 配下のindex.phpが表示された。
ルートディレクトリが正しくない。
xampp\apache\conf
のhttpd.cofでDocumentRootを変更したら
fobiddenと表示された
等の場合はこの問題にハマっているかもしれない。
結論としては、ssl(https)が原因だった。
当サイトでは、同じページを
https://www.trp3l.com や http://など
複数の書きかたで表示できないように、すべてhttps://へリダイレクトするよう設定がしてある。
http://ならば、よくある説明のとおり、
C:\xampp\apache\conf\extra
(xamppをC直下にインストールしているとする) にある
httpd-vhosts.conf
の文末に
<VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/test1" ServerName test1 <\VirtualHost>
や
<VirtualHost *:80> DocumentRoot "D:/your-local-dir/test1" ServerName test1 <\VirtualHost>
と追加して、管理者権限でsystemのhostsファイルに 127.0.0.1 test1
などと記述してやればよいが、
これらはhttp://から始まるページでしか正常に機能しない。
ssl認証を使用する場合は、別途色々と設定が必要で手順が少し複雑だが、
Web屋の芝生DIYさんのこのページに丁寧なまとめが
記載されており、大変参考になった。
同様の問題に悩んでいる方はぜひリンク先を参考にし、
それでも動かない場合はエラーログの内容でググることを推奨する。
エラーログは初期設定ではxampp\apache\logs\error.log
に記載がある。
沼った話はこれで解決したが、余談として、構築したローカル環境で htaccess、sessionの設定が正常に機能しなかったため
いくつかコードに追記を行ったので、その内容を記載しておく。
cookieの管理場所をhtaccessで制御している場合、sessionファイルの置き場は絶対パスで指定する必要があり、ローカル環境ではパスが一致せず、
ファイルが見つけられない。
これを回避するため、$_SERVER['DOCUMENT_ROOT']
がC:xampp\"my_testserver"\と一致するかをsession_start()の前に判定し、
これがtrueである場合、ローカル環境でのアクセスであることが分かるので、
session_save_path("C:/xampp/htdocs/session_file_dir");
として、htaccessによるsessinファイルの管理場所指定をphpで上書きした。
また、BASIC認証を使用しているページでもhtaccess中に記載されたhtpasswdの絶対パスが一致しないことによるエラーが発生したため、
手を加える必要があったのだが、こちらに関してはphpで制御できないため
サーバーとローカル環境でhtaccess内の記述を変えることで無理やり対応する以外方法が思いつかなかった。
htaccess内で適切な分岐を行う方法の模索を今後の課題としたい。