http を https にする .htaccess の話
のだけど。
横文字サイトに飛ぶようになることがあります。
これは、リダイレクト先がわけわかめのときに吹っ飛ぶ既定のサイトです。
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ですが・・・とりあえず、いろいろな可能性を排除することができました。
スポンサーリンク