Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

やりたいこと

「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がない状態でアクセスされる。
  • [R=301,L]: 恒久的なリダイレクト(R=301)。処理はここで終わり(L)。

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 を記載しないと、そもそもリダイレクト処理が動かない。
takahashi-kazuki
文系出身(漫才の勉強してました)の未経験の3年目インフラエンジニアです。 Azure, AWSのクラウドを中心に、設計・構築を行っています。
headwaters
常に新しい技術を取り込み、ありとあらゆる技術を駆使してビジネスを仕掛けるエンジニア集団です。技術力をベースに世の中の課題を解決しつつ、クライアントの強みを生かしたスタートアップインテグレーターとして共に事業も展開しています。「AI企画開発​」「マルチAIプラットフォーム(SyncLect)」「ロボットアプリ企画開発​」「React Native/Monaca/PWAアプリ開発」...etc他多数
http://www.headwaters.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away