はじめに
レンタルサーバー等では .htaccess でアクセス制限やリダイレクトの処理を行っているかと思いますが、エンジニアの方でも普段なかなか触る機会のない方が多いのではないでしょうか。
筆者もそのうちの一人だったのですが、WordPress や EC-CUBE といったオープンソースの開発に携わる機会が多かったので、気がつけばリリースやメンテナンスの際に頻繁に .htaccess を触るようになっていました。
そんな .htaccess の学習の際に、Docker をサクッと立てて勉強することで理解も深まったので、今回は実際に練習に使っていた環境をご紹介しようかとおもいます。
練習用環境の用意
ディレクトリ構成
任意の作業ディレクトリ
├── docker-compose.yml
├── Dockerfile
└── src/
├── index.html
├── maintenance.html
└── .htaccess
各ファイルの準備
docker-compose.yml
version: '3.3'
services:
php-apache:
build:
context: .
ports:
- '80:80'
- '443:443'
volumes:
- ./src:/var/www/html
Dockerfile
ARG PHP_VERSION=8.3
FROM php:${PHP_VERSION}-apache
RUN apt update && apt install -y --no-install-recommends \\
vim \\
ssl-cert \\
&& apt clean \\
&& rm -rf /var/lib/apt/lists/* \\
;
RUN a2enmod rewrite setenvif headers ssl
RUN ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf
EXPOSE 443
index.html
this is index.html
maintenance.html
this is maintenance.html
.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Docker コンテナを起動
下記コマンドでコンテナを起動する。
docker-compose up
https://localhost にアクセスすれば this is index.html
が表示されるはず。
「この接続ではプライバシーが保護されません」と表示されることがありますが、ローカル環境ですので、「thisisunsafe」と入力して、そのままアクセスして問題ありません。
.htaccess の動作確認
はじめに設定した .htaccess は、https による接続を強制するように設定しています。
試しに http://localhost にアクセスすると https://localhost にリダイレクトされるのが確認できると思います。
リダイレクトが確認できたら、.htaccess の内容を全てコメントアウトしてみましょう。
.htaccess
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
この状態で、試しに http://localhost にアクセスすると、リダイレクトが無効になったのが確認できたと思います。
あとは色々と .htaccess を練習してみてください。
mod_rewrite と mod_setenvif が使えるように設定してあるので、さまざまな条件を指定しながらアクセス制限やリダイレクト処理の記述の練習ができると思います。
一例として、特定のIPは自由にアクセスを許可し、管理画面に特定のIP外からアクセスがあった際には Basic 認証をかける。またアクセスに応じて301・302リダイレクト処理を行い、特定のパスやファイルへのアクセスは自由に許可する。方法を貼っておきます。こちらの解説はまた今度しますのでお楽しみに。
ErrorDocument 503 /maintenance.html
<IfModule mod_setenvif.c>
SetEnvIf Request_URI ^/administrator admin_path
SetEnvIf Request_URI ^/lp nomaintenance
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{ENV:REDIRECT_STATUS} !=503
RewriteRule ^maintenance\.html$ / [R=301,L]
RewriteCond %{ENV:REDIRECT_admin_path} !=1
RewriteCond %{ENV:REDIRECT_nomaintenance} !=1
RewriteCond %{ENV:admin_path} !=1
RewriteCond %{ENV:nomaintenance} !=1
RewriteCond %{REMOTE_ADDR} !=111.222.33.444
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpe?g)$ [NC]
RewriteRule ^.*$ - [R=503,L]
RewriteRule ^contact$ /help/about [R=302,L]
RewriteRule ^help\/privacy$ https://example.com/privacy_policy/ [R=301,L]
</IfModule>
AuthUserFile "/path/to/.htpasswd"
AuthName "Member Site"
AuthType Basic
<RequireAny>
Require ip 111.222.33.444
Require local
Require valid-user
<RequireAll>
Require all granted
Require not env REDIRECT_admin_path admin_path
</RequireAll>
</RequireAny>
コメント