Apache 301 Redirectバーチャルホスト

Apache の名前ベースのバーチャルホスト設定で https への 301リダイレクトを設定 | CentOS 7

301 Redirect Apache
スポンサーリンク

前回の記事 で Let’s Encrypt の ワイルドカード証明書 を無料で取得し、dns-rfc2136 で自動更新も行いました。今回はその証明書を使い、名前ベースのバーチャルホスト を利用して複数のドメインを 301リダイレクトし、HTTPSに転送 する設定を追加します。.htaccessでもできますが、ここでは名前ベースのバーチャルホストを利用することが前提です。

サーバ環境

[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

[root@centos7 ~]# /usr/local/apache2/bin/httpd -v
Server version: Apache/2.4.39 (Unix)

[root@centos7 htdocs]# nghttp --version
nghttp nghttp2/1.38.0

[root@centos7 htdocs]# openssl version
OpenSSL 1.1.1b  26 Feb 2019

# その他
Brotli-1.0.7
apr-1.7.0
apr-util-1.6.1

前提

Let’s Encrypt のワイルドカード証明書を無料で取得し、dns-rfc2136 で自動更新の設定済みで、HTTP で稼働していた複数のホストを HTTPS に引っ越しする予定です。

Apache は yum ではなく、コンパイルしたため、ディレクトリ構造はコンパイルバージョンを使います。

  • ServerRoot:/usr/local/apache2 ( yum:/etc/httpd )
  • DocumentRoot:/usr/local/apache2/htdocs ( yum:/var/www/html )
  • Include ディレクトリ:/usr/local/apache2/conf/extra ( yum:/etc/httpd/conf.d )
  • Access Log:/usr/local/apache2/logs/access_log
  • mainhost.com : デフォルトディレクトリ ( /usr/local/apache2/htdocs ) を使うメインホス
  • example.com : /usr/local/apache2/htdocs/example.com ディレクトリを使うホスト。
  • 既存のウェブサービスは htaccess の Basic 認証をかけたまま設定を行う。

Apache の設定

このリンクの httpd.conf ファイルを /usr/local/apache2/conf/httpd.conf にコピベーしてください。

# 下記の項目を含め、適宜変更してください。
[root@centos7 conf]# vi /usr/local/apache2/conf/httpd.conf
...

ServerAdmin admin@example.com
ServerName www.example.com:80
...

Include conf/extra/httpd-ssl.conf
Include conf/extra/httpd-vhosts-10-service.conf
...

# 設定を確認
[root@centos7 conf]# /usr/local/apache2/bin/httpd -t
Syntax OK

httpd-vhosts-10-service.conf で 80 ポート & 301リダイレクト 設定を、httpd-ssl.conf で 443 ポート すなわち、HTTPS の設定を行います。

Apache では名前ベースのバーチャルホストを設定すると、httpd.conf で設定したメインホストの設定が消える仕様なので メインホストの ServerName と DocumentRoot が同様なバーチャルホストを生成しなければなりません。
また、バーチャルホストブロックは書かれた順に、またはファイルに分割した場合はファイル名順に適用されるため、メインホストを最も手前に配置させることが重要です。

80ポート & 301リダイレクト( Redirect ) 設定

httpd-vhosts-10-service.conf

ここから httpd-vhosts-10-service.conf をコピペしてください。
mainhost.com と example.com が設定された conf ファイルです。ドメイン名など適宜変更して使ってください。

[root@centos7 extra]# vi /usr/local/apache2/conf/extra/httpd-vhosts-10-service.conf

301リダイレクト( Redirect ) の設定内容

リダイレクトを設定するには httpd.conf で rewrite_module を有効にする必要があります。コピペした httpd.conf にはすでに有効になっています。

LoadModule rewrite_module modules/mod_rewrite.so

リダイレクトの最小限の設定は、エンジンを ON にして、必要なルールをを記述するだけです。実際には、変数の値を正しくインポートできない場合があったりするので、ご自身の環境と具合を観ながら条件を加減する必要があります。コピペで動作しなかったら他の設定を試してみてください。

作成 ( 動作 ) の流れは、
RewriteEngine を ON、Rule が動作する条件 ( RewriteCond ) を指定、条件に応じた Rule ( RewriteRule ) が実行される。

書式:RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]

RewriteEngine     on
RewriteCond       %{HTTPS}        !on         [OR,NC]
RewriteCond       %{REQUEST_SCHEME}           !https  [OR,NC]
RewriteCond       %{SERVER_PORT}      !443   [NC]
RewriteCond       %{HTTP_HOST}    ^mainhost\.com$  [NC]
RewriteRule         ^(.*)$             https://www.%{HTTP_HOST}$1 [R=301,L]
RewriteRule         ^(.*)$             https://%{HTTP_HOST}$1 [R=301,L]
上記の設定を解釈
  • RewriteEngine を起動する。
  • [NC] フラグで URL に入力した文字は大文字小文字の区別をしない
  • RewriteCond を複数の条件を記述した場合、フラグはデフォルトで AND になる。
  • したがって、適用するリダイレクトは
    HTTPS ではないアクセスの中でwww をつけた場合はそのまま HTTPS へリダイレクトされるが、http://mainhost.com のように www がない場合は www をつけて HTTPS にリダイレクトされる。
# 設定を確認
[root@centos7 conf]# /usr/local/apache2/bin/httpd -t
Syntax OK

SSL を設定します。

SSL 証明書を指定して HTTPS を有効に

httpd-ssl.conf

ここから httpd-ssl.conf をコピペしてください。

[root@centos7 extra]# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
# 設定を確認して httpd デーモンを再起動
[root@centos7 conf]# /usr/local/apache2/bin/httpd -t
Syntax OK

[root@centos7 conf]# systemctl restart httpd

リダイレクトの結果を確認

Macbook Pro で確認をしています。
curl コマンドの結果メッセージの中に「HTTP/1.1 301 Moved Permanently」と表示され、Location が http → https に変われば OK です。

main-host.com

http://main-host.com ▶︎ https://www.main-host.com

HTTP/1.1 301 Moved Permanently
Location: https://www.main-host.com/

try🐶everything ~$ curl -I http://main-host.com
HTTP/1.1 301 Moved Permanently
Date: Tue, 18 Jun 2019 08:20:05 GMT
Server: Apache
Location: https://www.main-host.com/
Content-Type: text/html; charset=iso-8859-1

try🐶everything ~$

http://www.main-host.com ▶︎ https://www.main-host.com

HTTP/1.1 301 Moved Permanently
Location: https://www.main-host.com/

try🐶everything ~$ curl -I http://www.main-host.com
HTTP/1.1 301 Moved Permanently
Date: Tue, 18 Jun 2019 08:20:10 GMT
Server: Apache
Location: https://www.main-host.com/
Content-Type: text/html; charset=iso-8859-1

try🐶everything ~$

example.com

http://example.com ▶︎ https://www.example.com

HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/

try🐶everything ~$ curl -I http://example.com
HTTP/1.1 301 Moved Permanently
Date: Tue, 18 Jun 2019 09:58:21 GMT
Server: Apache
Location: https://www.example.com/
Content-Type: text/html; charset=iso-8859-1

try🐶everything ~$

http://www.example.com ▶︎ https://www.example.com

HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/

try🐶everything ~$ curl -I http://www.example.com
HTTP/1.1 301 Moved Permanently
Date: Tue, 18 Jun 2019 09:58:26 GMT
Server: Apache
Location: https://www.example.com/
Content-Type: text/html; charset=iso-8859-1

try🐶everything ~$

以上、301 リダイレクト設定と動作確認ができました。

TIP

Rewrite モジュールで使うサーバー変数を確認する方法

index.php ファイルを作成します。

[root@centos7 htdocs]# vi example.com/index.php
<?php
phpinfo(INFO_MODULES);
?>
[root@centos7 htdocs]#

https://example.com へサクセスし、必要な変数を検索します。
例として REQUEST_SCHEME を検索して確認します。

php-variables-request-scheme
▲ サーバ変数を検索できます

Nginx の方は簡単にできますので、追記しておきます。

Nginx での 301 Redirect 設定

80ポートに対して、return 301 https://$host$request_uri;を追加するだけでリダイレクト設定は完了です。

[root@centos7 conf.d]# cat /etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name www.example.com;
    # 301 Redirect
    return 301 https://$host$request_uri;
}

server {
    listen              443 ssl;
    server_name         www.example.com;
...
}

conf ファイルを保存して Nginx をリロード ( systemctl restart nginx ) します。
Macbookなど、クライアントマシーンから動作確認をします。

# http://example.com ==> https://example.com
try🐶everything frontend$ curl -I http://example.com
HTTP/1.1 301 Moved Permanently    << 301リダイレクトされました
Server: nginx/1.14.0
Date: Mon, 09 Sep 2019 11:14:20 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://example.com/    << ここ!

# http://www.example.com ==> https://www.example.com
try🐶everything frontend$ curl -I http://www.example.com
HTTP/1.1 301 Moved Permanently    << 301リダイレクトされました
Server: nginx/1.14.0
Date: Mon, 09 Sep 2019 11:14:26 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://www.example.com/    << ここ!

try🐶everything frontend$ 

Nginx の方が確実に簡単ですね!!

スポンサーリンク

参考文献

名前ベースのバーチャルホスト

コメント

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