【Apache mod_rewirte】RewriteRuleの設定ミスでhttpからhttpsへのリダイレクトではまる

  • このエントリーをはてなブックマークに追加

概要

先日、Let’sEncrptを用いてサーバを常時SSL化した時にhttpからhttpsへ上手くリダイレクトできなかったのでここに解決方法とmod_rewirteの仕組みは簡単にメモします。

はまったこと

LetsEncryptのcerbot-autoを使って一つのドメインに対してSSLを導入する場合は下記設定が自動で入ります。

RewriteEngine on
RewriteCond %{SERVER_NAME} =ドメイン
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]

もし複数ドメインのSSL化をLetsEncryptのSANという枠組みで設定した場合は、自動で証明書の作成まではやってくれますが、例えばapacheを使っていた場合にはSSL設定を自分で記述しなくてはいけません。上手くリダイレクトされなかったのは自分で記述するときに RewriteRule ^の^を抜いてしまい上手くリダイレクトしてくれませんでした。

各リダイレクト設定について

RewriteEngine on

  • mod_rewriteモジュールの機能を有効化します
  • 有効化してもそもそもmod_rewriteモジュールがインストールされてないといけません。下記確認コマンドで確認。

確認コマンド

httpd -M | grep rewrite_module
Syntax OK │
rewrite_module (shared)
  • 動的モジュールなのでLoadModule設定が必要で、だいたいhttpd.confに記述されています

自分の環境だとhttpd.confの196行目に記載がありました

196 LoadModule rewrite_module modules/mod_rewrite.so

RewriteCond

リダイレクトを実行する条件です。この条件に当てはまるとRewirteRuleのリダイレクトルールに則ってリダイレクトされます。

RewriteCond %{SERVER_NAME} =FQDN
  • %{SERVER_NAME}はリクエストを受けた時にapacheが設定する変数です。ホスト名(FQDN)がはいります。

RewriteRule

構文

RewriteRule 条件パターン 置換文字列 [フラグ]
  • 「置換文字列」は、わたってきたURLと「条件パターン」がマッチした場合に、置換されます。
  • 条件パターンに「^」を指定すれば、行頭は存在するのでRewriteCondで条件がtrueであれば、ここで全てマッチして置換されるはずです。
  • 私の場合は^を削除してしまったことで、条件パターンがなくなり、何もマッチせずに置換されずリダイレクトもされませんでした。

フラグ

[L,NE,R=permanent]
  • L
  • マッチしたらRewriteを止めます。以降のルールは無視!
  • NE
  • “.”, “?”, “%”などの特殊文字が”%25″のようにエンコードされるのを防ぐ
  • R=permanent
  • 指定したURL(置換文字列)にリダイレクトする。=リダイレクトコードでリダイレクト付加できる。この場合だと”Permanent Redirect”(301)で「恒久的な転送」を意味する。
  • [L]フラグと同様、以降のルールは無視される

フラグにRがあるのでリダイレクトしてくれます

%d人のブロガーが「いいね」をつけました。