Docker で Apache と PHP を建てて .htaccess の練習をする方法

Docker

はじめに

レンタルサーバー等では .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>

コメント

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