Google Chromeのバージョン68からSSL化されていないウェブサイトでは「保護されていません」という警告が表示されるようになりました。httpからはじまるURLにアクセスするとこのように表示されます。
SSL化は検索結果の順位に影響があるとも言われており、以前なら割高だった証明書の取得もレンタルサーバー各社が無料のものを提供するようになったことから、https対応するウェブサイトが増えてきたように感じます。
301リダイレクト
ウェブサイトを表示するにはブラウザがサーバーからHTMLファイルなどのデータを受け取ることで実現しているのですが、このとき一緒に「HTTPステータスコード」というものも渡されます。
これは3桁の数字で表現されており、よく見かけるものとしてページが見つからないときには「404」、サーバーでエラーが発生しているときには「500」が返されます。リクエストが成功したときに返るコードは200です。
ステータスコードは巡回してきた検索エンジンのクローラにも渡され、ウェブサイトの状態を判断するのに活用されます。
さて、ブログをSSL対応するとアドレスの先頭がhttpからhttpsに置き換えられます。ブログを運営する側からすれば記事の内容は同じなのですが、URLが変更になったことで検索エンジンはこれを別の記事であると判断します。
このままでは時間をかけて獲得した記事やウェブサイトに対するページランクや被リンクの評価がリセットされてしまいます。そこでURLが変更になったことを検索エンジンに通知しなければなりません。このとき使うのが移転=リダイレクトを表わすステータスコード「301」です。
検索エンジンに301を通知するには、.htaccessファイルを編集してレンタルサーバーにアップロードします。
ちなみに、リダイレクト系のステータスコードとして302がありますが、こちらは一時的な移動を意味します。サイトリニューアル中で一時的に別のURLに転送するときなどに使います。
.htaccessファイル
今回はエックスサーバーにインストールしたWordPressをSSL化した場合、どのように.htaccessファイルを編集すればよいのかを説明します。.htaccess以外の手順についてはこちらをご覧ください。
エックスサーバーでWordPressをSSL化してみた | Naokix.net
エックスサーバーにWordPressをインストールする場合、一般的にはpublic_htmlフォルダにwordpressフォルダをアップロードすることが多いと思います。
public_htmlに.htaccessがあるはずなので、こちらをローカル環境にダウンロードしておいてください。301リダイレクトするにはこちらを編集していきます。.htaccessはテキストエディタなどで開いてください。
追加するソースコードは次のとおりです。
1 2 3 4 5 | <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule> |
こちらは記事執筆時点でエックスサーバーさんが公式に推奨しているソースコードであり、これを.htaccessにコピー&ペーストしてアップロードすれば普通に動作します。
「コピペしてちゃんと動いたから、はいオシマイ」でもいいのですが、プログラマたるもの自分の書いたソースコードの意味ぐらいは知っておきたいものです。一行ずつ見ていきます。
1 | <IfModule mod_rewrite.c> |
mod_rewriteはApacheのモジュールです。URLの書き換えやリダイレクトしたいときに指定します。
HTMLタグのような形式になっており、最後の行に閉じダグらしきものも記述されています。
Apacheのモジュールが動作するにはhttpd.confという設定ファイルを編集する必要がありますが、httpd.confでmod_rewriteが有効になっていればタグで囲まれたコードが実行されます。
httpd.confを編集するにはサーバーのroot権限が必要です。レンタルサーバーでは設定を変更できませんが、最近のレンタルサーバーではmod_rewriteがデフォルトで有効になっています。
XAMPPの場合にはC:\xampp\apache\conf\httpd.confを編集してください。
1 | RewriteEngine On |
この記述によりmod_rewriteによるURLの書き換えが有効になります。
1 | RewriteCond %{HTTPS} !on |
「RewriteCond」はRewriteRuleを適用する条件を記述します。RewriteCondに示された条件を満たしたときにだけURLの書き換えを行います。
他のプログラミングを経験したことがあるならif文を思い浮かべてください。
1 2 3 | if (%{HTTPS} != on) { // RewriteRuleでURLを書き換える } |
今回は「先頭がhttpsでないアクセスがあった場合」という条件です。
1 | RewriteCond %{HTTPS} off |
と記述されているソースコードもありますが意味は同じです。
1 | RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] |
ブラウザがサーバーにアクセスするとき、HTTPリクエストヘッダにいろいろな情報を付与して送信しています。これを「HTTP環境変数」と呼びますが、この情報は%{環境変数名}と指定することでRewriteCondやRewriteRuleで利用することができます。
HTTP_HOSTはリクエスト先のホスト名(DNS名)です。今読んでいただいている記事を例にすると「naokixtechnology.net」です。
REQUEST_URIはページにアクセスするために指定されたURIです。この記事では「/rental_server/3497」となります。
RewriteCondで条件を満たした場合にRewriteRuleにおいてURLの書き換えを行いますが、RewriteRuleの書式は次のようになります。
1 | RewriteRule (置換前のURLのドメイン以降) (置換後のURL) [オプション] |
「置換前のURLのドメイン以降」ですが、この記事を例にすると「rental_server/3497」となることに注意してください。スラッシュは含みません。
「置換前のURLのドメイン以降」は正規表現を使って記述できます。
.は任意の1文字
*は直前の文字を0回以上繰り返す
^は文字列の先頭
$は文字列の最後
すなわち、「^.*$」はあらゆる文字列にマッチすることを意味します。
.*を「(」と「)」で囲んでいますが、正規表現にマッチした()で囲まれた文字列は「置換後のURL」で使用することができます。$1で参照するのですが、先ほど環境変数HTTP_HOSTとREQUEST_URIで記述したものは次のように書くこともできます。
1 | RewriteRule ^(.*)$ https://naokixtechnology.net/$1 [R=301,L] |
最後にオプションです。カンマで区切れば複数のオプションを指定できます。
Rはリダイレクトを意味しており、=でステータスコードを指定できます。検索エンジンに伝えたいコードは301であり、これで記事が移転したことを示せます。
LはLastの略です。mod_rewriteは上から順番に条件を満たすかを判定していきますが、Lフラグを指定したRewriteRuleでURLの書き換えが行われた場合にはそこで条件判定を終了します。
どこに追記するか
先ほどダウンロードした.htaccessには次のようなソースコードが記述されていると思います。
1 2 3 4 5 6 7 8 9 10 | # 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 |
たまにこのファイルに追記するプラグインもあるようですが、その場合には適宜読み替えてください。ファイルの先頭に先ほどのコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule> # 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 |
編集後に保存し、public_htmlフォルダに.htaccessをアップロードして上書きしてください。
まとめ
ブログをSSLに対応するのが大変で、.htaccessに書かれているソースコードの意味をひとつずつ拾っていけないのはよくわかります。「コピペして動けばOK」でもなんとかなったりしますが、ちょっと環境が変わって.htaccessを修正する必要にせまられたりすると、途端にハードルが高くなります。
忙しいとは思いますが、いざというときに慌てないでも済むように、日頃からソースコードの意味を調べる習慣をつけておくとよいかと思います。
Comment