[Apach].htaccess の設定(常時SSL化、拡張子削除・変更)

よく使うのでメモ用。

常時SSL化

参照元:httpからhttpsにリダイレクト、www有無のリダイレクト方法(mod_rewrite)|レンタルサーバーのCPIスタッフブログ

詳しく知りたい方は上記のURLのサイトを見たほうが確実。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteRule ^(.*$) https://example.com/$1 [R,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
</IfModule>

拡張子削除・変更

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.*)\.php$ $1 [R,L]
</IfModule>

上記、WordPress環境ですべてのリクエストがindex.phpを通るため、RewriteRule ^index\.php$ – [L] を入れないとすべてのURLがトップページにリダイレクトされます。

なので、index.phpは除外してるので完璧とは言えないです。(DocumentRootのindex.phpだけ、という指定に変えればよいだけかも。。)

あと、実現できたけれど、RewriteRule ^(.*)\.php$ $1 [R,L] がどうして想定通りにリダイレクトしてくれるのかを正確に把握できていません…。

$1に拡張子のないURLが渡ってくれている理由がわからないので、もしわかる方いたら教えて欲しいです。。「このページの場合、/archives/1771.php でリクエストしたら /archives/1771.php がそのまま渡っちゃうんじゃないの?」と不思議です。

拡張子を変更する場合

- RewriteRule ^(.*)\.php$ $1 [R,L]
+ RewriteRule ^(.*)\.php$ $1.html [R,L]

mod_rewriteで使えるサーバ変数

%{DOCUMENT_ROOT}

ドキュメントルートのPATH(/var/www/htmlとか)%{HTTP_HOST}
ホスト名 このサイトだと nkmrkisk.com

%{HTTP_USER_AGENT}

“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36”
みたいに、JSの(navigator.userAgent)で取れるやつ。ブラウザのURLのところに下記を貼り付けると見れる。

javascript:alert(navigator.userAgent);

%{REQUEST_METHOD}

POSTとかGET

%{REQUEST_URI}

このURLだと(/archives/1771)

%{HTTPS}

on か off が返ってくる

詳しく知りたい方はこちらのサイトを見ると良いです。 mod_rewriteで使えるサーバ変数のチートシート – Mod_Rewrite Variables Cheatsheet

補足(301,302リダイレクト)

R=301 → 恒久的なリダイレクト
R=302 → 一時的なリダイレクト

301 を使うとサーバーの移管などで困りやすいので、基本的にリダイレクトのステータスコードは不要。もしくは302にしておいた方が無難。

さくらのレンタルサーバーは注意

一部のレンタルサーバー等(例:さくらサーバー)で、確か動かないケースなどがあったはず。

さくらのレンタルサーバーでのリダイレクト設定「.htaccess」を使ってhttp→httpsとwww有り無し統一のやり方

<IfModule mod_rewrite.c>
RewriteEngine On RewriteCond %{ENV:HTTPS} !on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

%{HTTPS}じゃ http/httpsの判別ができなくて、%{ENV:HTTPS}じゃないとダメ。とかだったかな。。かなり前にそれで困ったので一応メモ。(今はもう違うかもしれない)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください