70
69

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.

htaccessでHTTPSにリダイレクトする

Posted at

エンジニアたるものhttpは使わないようにしましょう。使う意味がありません。
しかし、世の中にはすでにhttpで運営されてるサイトやAPIがたくさんあります。
そこで今回はすでにhttpだけど、httpsでの運用に切り替えるときに使うhtaccessを書こうと思います。
(検索しても意外と決定版みたいなのないので)

単純な場合

これはapacheが1台の構成の場合のものです。特に上流にバランサ(ELBなど)がない場合を想定しています。
下記のような内容で.htaccessを書きましょう。

/var/www/html/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

このなかでRewriteRuleの最後に書いてある[R=301,L]のとこなのですが、Rがリダイレクトを指しており、=301を省略すると302がデフォルトになります。
用途に応じて使い分けると良いでしょう。

  • [R=301,L] 永久的なHTTP→HTTPS
  • [R,L] 一時的なリダイレクト

ロードバランサー(80,443対応)の配下にある場合

これはAWS環境でELBがある場合や、その他のプロプライエタリなロードバランサ(LoadMaster、BigIP、Coyote、A10など)の場合に適用できます。もちろんNginxなどのリバースプロキシを使う場合も有効です。
基本的には上流のバランサーにHTTP/HTTPSに応じてリクエストヘッダーを付与してもらいます。
apacheではその内容に応じたRewriteCondを記述します。

例えばAWS環境のELBの場合は下記のようになります。

/var/www/html/.htaccess
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2行目のRewriteCondはHTTPだった場合に付加されるリクエストヘッダーを想定しています。これは製品によって異なりますが、%{HTTP:X-Forwarded-Proto}はAWSのELBの標準的なリクエストヘッダーです。

まとめ

apacheでやる限りだいたい上記の2パターンで事が足りるでしょう。もし細かく制御したいケースやご要望などあれば追記しますので、コメントなどでどうぞ。

70
69
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
70
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?