mod_rewriteでアクセス制御がうまく動かない!→条件のところにスペース入ってない?

Apache設定

皆さまこんにちは、ウチイダユウゴです!

Apacheの設定ファイルって、プログラミング言語とはまた違って独特ですよね。

Apacheを扱い始めて1年くらいたつのですが、いまだに違和感を覚えたりイメージと異なるものがぽつぽつと出てきます。

今日は(も)、Apacheの設定変更でつまづいたのでメモしておきます。

動作検証について

この記事のサンプルは以下の環境で動作することを確認しています。

バージョン違いなどで動かないこともあり得ますので、ご了承ください。

  • Vagrant仮想環境 – CentOS Linux release 7.7.1908 (Core)
  • Apache 2.4.41 (IUS)

特定のIPからアクセスしたときのみ、内容を見せる

Webサイトのメンテナンス時や制作中のページの動作を確認する際、自社IPなどからアクセスしたときだけページを表示するという処理を行うことがあります。

そんな時は%{REMOTE_ADDR}を用いてRewriteCondを記述できます。

以下は、特定のIP以外からアクセスされたときにメンテナンスページへアクセスする例です。

<Directory /path/to/testDir/>
    <IfModule mod_rewrite.c>
        RewriteEngine On
        #指定のIP以外はmaintenance.htmlへ遷移させる
        RewriteCond %{REMOTE_ADDR} !=192.168.1.1
        RewriteRule (.*) /path/to/maintenance.html [R=302,L]
    </IfModule>
</Directory>

httpd.confなどに上記を追記して、保存します。
その後、設定をリロードしてください。

# sudo systemctl reload httpd

.htaccessに記述する場合は、Directoryディレクティブを外しちゃってくださいね。

要注意!RewriteCondの構文

ウチイダはRewriteCondを以下のように記述してしまい、うまく動作しませんでした。

RewriteCond %{REMOTE_ADDR} != 192.168.1.1

前のコードと比べてみればわかりますが、「!=」の後ろにスペースを入れています。これだと条件文として解釈されません。

Apacheの設定ファイルでは、スペースはインデントに用いられるだけでなく、区切り文字として利用されることがあるのです。

JavaScriptやPHPでは、スペースは条件式の間に入っていても無視されます。

いつもの癖で、つい無意識にスペース入れてしまったのでした。。。

RewiteCondでは区切り文字になっているので、スペースを入れてはいけなかったようです。

構文はきちんと確認して記述するようにしようと改めて思ったのでした。

以上、最後までお読みいただきありがとうございました(/・ω・)/

コメント

タイトルとURLをコピーしました