10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【mod_rewrite】「wwwあり」かつ「https」にリダイレクトさせる

Posted at

#やりたいこと
「wwwあり」かつ「https」にリダイレクトさせる

■使用するドメイン(※存在しないものです。)
takahashi.local

■想定されるアクセスパターン
http://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
http://www.takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト
https://takahashi.local にアクセス ⇨ https://www.takahashi.local へリダイレクト

#構成

  • LBはなし(サーバーに直接アクセスが来る)
  • SSL証明書はサーバー上に設定済み
  • CentOS7
  • Apache2.4
  • mod_rewrite
  • Vhostsの設定ファイル(/etc/httpd/conf./配下)で設定を記述する

#実際に行った設定

# cat /etc/httpd/conf.d/rewrite.conf

<VirtualHost *:80>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  RewriteEngine On
  RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]

</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  SSLEngine on
  SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
  SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
  SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt

  RewriteEngine On
  RewriteCond %{HTTPS} on
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>

#解説

  • ServerAlias: takahashi.localにアクセスが来ても、「ServerName www.takahashi.local」 が処理するようにする。
  • RewriteCond %{HTTPS} on: httpsでアクセスされる。
  • RewriteCond %{HTTP_HOST} !^www.: ホスト部の先頭にwwwがない状態でアクセスされる。

###80番ポートでアクセスが来た際のリダイレクト設定
80番ポート(http)でアクセスが来たら、有無を言わさず「https://www.takahashi.local」 へリダイレクトさせれば良いので、下記のようにRewritecondは書かなくてOKです。

<VirtualHost *:80>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  RewriteEngine On
  RewriteRule ^(.*)?$ https://www.takahashi.local$1 [R=301,L]

</VirtualHost>

###443番ポートでアクセスが来た際のリダイレクト設定
ただし、443番ポート(https)でアクセスが来た時のリダイレクトされるパターンは、「wwwなし」かつ「https」なのでその条件式をRewritecondに書いてあげないといけません。

<VirtualHost *:443>
  DocumentRoot "/var/www/html"
  ServerName www.takahashi.local
  ServerAlias takahashi.local

  SSLEngine on
  SSLCertificateKeyFile /etc/httpd/ssl/key/www.takahashi.local.key
  SSLCertificateFile /etc/httpd/ssl/certs/www.takahashi.local
  SSLCertificateChainFile /etc/httpd/ssl/certs/www.takahashi.local-chain.crt

  RewriteEngine On
  RewriteCond %{HTTPS} on
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>

#つまづきポイント

  • Vhostsの設定ファイルにSSLの設定(SSLEngine等)を記載する場合、デフォルトのssl.conf内の証明書ファイルパスをコメントアウトするとApacheが起動しなくなる。
  • Listen443の記載するファイルは1つのみ。複数の設定ファイルで記載すると競合してApacheが起動しません。
  • RewriteEngine On を記載しないと、そもそもリダイレクト処理が動かない。
10
14
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?