アクセスして欲しくないディレクトリやファイルは403 forbidden を返すという設定をすることはよくあると思います。ですが、403 forbidden だとディレクトリもしくはファイルがあることがばれてしまうので、404 not found を返したいと思うこともあるのではないでしょうか。
そんな方のために、以下を紹介します!
前提条件
- apache がインストールされていること
(バージョンは何でも大丈夫です)
事前準備
今回は403 環境を作成するために、DocumentRoot に.htaccess で拒否して、再現したいと思います。
Docuemnt Root:
/var/www/html
先ずはDocument Root に移動して、.htaccess を作成します。
今回は全てのリクエストを拒否したいので、htaccess でその設定を入れてあげます。
# DocumentRoot に移動
cd /var/www/html
# htaccess 作成
touch .htaccess
記述内容:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Order deny,allow
deny from all
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
この設定だけでは、.htaccess が効かないので、httpd.conf で設定の上書きを可能にする必要があります。
# Further relax access to the default document root:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All <= この部分を All にしてください(None はダメ)
Require all granted
</Directory>
#syntax 確認
httpd -t
Syntax Ok
# リスタート
systemctl restart httpd
上記のように設定します。そうするとdeny from all ですべてのIP からのリクエストが拒否されるという設定になります。拒否されているのをcurl もしくはブラウザで確認できれば、オッケです。
これで準備ができました。
403 => 404 のための設定
設定は至極単純です。403 => 404 にリダイレクトするように設定してあげればそれで解決です。httpd.conf をもう一度開けます。
以下の設定を追加してください。
この設定の意味は、403 がきたら、missing.html を返してください。missing.html に対して、アクセスが来たら、404 を返してください。という内容です。
ErrorDocument 403 /missing.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule missing.html - [R=404,L]
</IfModule>
実際にこの設定をして、apache を再起動してあげると、あら不思議、404 not found が表示されるではないか!!!
まとめ
案外簡単なので、404 に表示を変えたい方は、是非ともしてほしい設定です。virtual host でも同様の設定をすると、404 の表示が実現できます。