開発室ブログ

apache

vhosts.conf に書いた mod_rewrite が効かなくて泥沼にはまる

最近新しいゲームを買ったのですが、一分でも多く狩りに出たい為、家事をいつもの3倍近くのスピードで終わらせてます。 オンラインゲームで遊ぶと、現実で友達と会う回数が極端に減りますね。現代病ですね。

先日、自社サイトがメンテナンスに入る際、全アクセスを503にリダイレクトさせるために .htaccessmod_rewrite を使って実現しようと思ったのですが、自社サイトの場合公開ディレクトリ下の階層にも.htaccessが置いてあるため全てに変更をかけないと行けないという、非常に面倒な状況でした。 なので今回はCentOSなので、/etc/httpd/conf.d/にバーチャルホスト用の.confファイル(vhosts.conf)を置き、そこで対応することにしました。

以下失敗例

<VirtualHost>
~~~ 略 ~~~
# 503の場合に出力するページを指定
ErrorDocument 503 /maintenance.php
<Directory "公開ディレクトリ">
Options FollowSymLinks
allowoverride all
Require all granted
# mod_rewrite
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.php
RewriteRule .* - [L,R=503]
</Directory>
</VirtualHost>

結構この辺の書き方は人によって様々ではあったんですが、”Directory”内に書いてあるのが推奨されていたので最初はこのように書きました。 が、しかし、一向にメンテナンスページは表示されることがありませんでした。 RewriteRuleが間違っているのかと思い、悪あがきをしてみましたが、全く意味を成さず。 というわけで以下のようにすると無事動きました。

<VirtualHost>
~~~ 略 ~~~
# 503の場合に出力するページを指定
ErrorDocument 503 /maintenance.php
<Directory "公開ディレクトリ">
Options FollowSymLinks
allowoverride all
Require all granted
</Directory>
# mod_rewrite
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.php
RewriteRule .* - [L,R=503]
</VirtualHost>

mod_rewriteの記述をDirectoryの外に出しました。 原因としてはDirectoryに指定してあるディレクトリに.htaccessが置いて有るため、そちらが優先されてたんですね~。 てっきり vhosts.conf > .htaccess の優先度だと思っていました。 次は忘れないでおこう・・・。

RecentPost