http を https にする .htaccess の話


スポンサーリンク

http を https にする .htaccess の話 ですけど、htaccess のリダイレクトを使って 非ssl を ssl にする。

のだけど。

横文字サイトに飛ぶようになることがあります。

これは、リダイレクト先がわけわかめのときに吹っ飛ぶ既定のサイトです。


htaccess のリダイレクトの書き方


ワードプレスの吐き出す .htaccess を参考に。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress


mod_rewite が使えるか確認のための1行目


IfModule mod_rewrite.c は、IF文です。
つまり、mod_rewite を使える場合、IfModule までを処理しなさいってことです。

つーことは? IfModule ってのは、モジュールが使えるかどうかを判断するときに使える .htaccess のコマンド。


RewriteEngine On 2行目


RewriteEngine は、リダイレクトエンジンだな。これを起動してくれって指示です。


RewiteBase 3行目


リライト処理後のパスを指定するコマンドです。
とりあえず、ルートである / にしておけばいい。


RewriteRule 4行目


リダイレクトをさせるコマンドで、その後ろが条件。

つまり、前方一致で index.php ならば、 - なにもするな。ってことね。

ここで一つのリダイレクト処理が終わります。なぜなら [L] ってフラグが付いているから。

リダイレクトのフラグの種類


フラグの書式は、[フラグ{,フラグ,{フラグ}}」の形で カンマで区切ることによって複数指定できます。

フラグ 意味 説明
C Chain このルールにマッチしたら、次のルールを評価
F Forbidden アクセス禁止(403-Forbidden)。リダイレクト処理はここまで。
G Gone 削除(410-Gone)
L Last リダイレクト処理はここまで。
NC No Case 大文字小文字を区別しない
NE No Escape ., “?”, “%”などの特殊文字をエンコードしない。
OR Or RewriteCond(条件)の OR 結合(無指定の場合 AND 結合になる)
PT Path Through Rewriteを終了
R Redirect 指定したURLにリダイレクト。[R=nnn]でダイレクトコードの付加ができる。リダイレクト処理はここまで


RewriteCond 6行目7行目


RewriteCondが、条件の設定になります。
6行目は、
RewriteCond %{REQUEST_FILENAME} !-f
環境変数 REQUEST_FILENAME がファイルでなければ。。。

つまり http://ドメイン/ ではなくてお尻に ファイル名の指定がなければということになります。
http://ドメイン/postname.html は、該当しない。

逆にファイルなら
RewriteCond %{REQUEST_FILENAME} -f
となります。!は、NOTの意味ですわ。

-d は、ディレクトリならという意味で http://ドメイン/フォルダー名/ が該当します。
で !-d なのでディレクトリでなければ。ということになります。

つまり、!-f と !-d で リクエストされた部分がファイルでも、ディレクトリでもなければ、以降を処理する。
という状態は。

http://ドメイン/ の状態の場合ということになります。


RewriteRule . /index.php [L] 8行目


リダイレクトのルールで . は、なんでもかんでも リダイレクト先 ./index.php に飛べ [L] ここまででリダイレクトおしまい。という意味になります。


つまり、環境条件(mod_rewrite を使えるか確認して、rewriteエンジンを Onにして、条件を付けてリダイレクトさせています。


htaccess で使う環境変数


応用を利かすには、環境変数を知りたくなりますよね?
環境変数は、%{環境変数名} で使います。

ここでは主旨違うのでひとつひとつ解説しませんが、
htaccess 環境変数一覧とかで検索すると見つかります。

とりあえず、
REQUEST_FILENAME:呼び出された時(リクエスト)の ファイル/ディレクトリ名 (通常は絶対パスで入ってきます)
HTTPS:SSL通信 SSL通信、つまり https で呼ばれたかどうか。
 使い方は、
 RewriteCond %{HTTPS} off
 https がOFFの状態なら。。。つまり http://ドメイン~で呼ばれているのならということになります。
 逆に On ならば、 https:// で呼ばれたことになります。
HTTP_HOST:呼び出されたドメインが入っています。
 RewriteCond %{HTTP_HOST} ^hogehoge.xyz$
 前方一致で hogehoge.xyz を呼び出しているならば。という条件になります。
 これは、www. の有り無しを処理するときに便利です。
 RewriteCond %{HTTP_HOST} ^www.$
 とかね。


リダイレクトのデバッグ


 条件一致のチェック、デバッグって普通のプログラムでも思い込みが出てしまいます。
 で、リダイレクトのデバッガー・・・ないから(汗

 でも
リダイレクトの経路を調べる(クローム)⇒https://nelog.jp/redirect-path
リダイレクトを止める(ファイヤーフォックス)⇒https://addons.mozilla.org/Ja/firefox/search/?q=NoRedirect&cat=1%2C0&appver=54.0&platform=windows

 これでデバッグできたかといえば、NOですが・・・とりあえず、いろいろな可能性を排除することができました。



スポンサーリンク