2017/7/23 追記
さくらインターネットが、WordPress常時SSL化プラグインの提供を開始しました。さくらのレンタルサーバでHTTPSな独自ドメインのWordpressサイトを構築する場合は、こちらのプラグインを使用することをおすすめします。
https://help.sakura.ad.jp/hc/ja/articles/115000047641
はじめに
さくらのレンタルサーバ(共有サーバ)でHTTPS(SNI SSL)な独自ドメインのWordpressサイトを構築する際の注意点についてまとめました。
まず、2015/2/4より、共有サーバでの独自SSL(SNI SSL)が利用可能となりました。
SNI(ネームベース)のSSLであるため、SNIに非対応の古い環境(ガラケー、Windows XP等)では正常に動作しませんが、これまでVPSや専用サーバ、上位プラン等でしか利用できなかった独自SSLが安価な共有サーバでも利用できるようになり、手軽にWebサイトのHTTPS化が行えるようになりました。
しかし、共有サーバで提供されるHTTPS接続は一般的な(VPSや専用サーバ等でApacheをインストールして運用する)HTTPSサイトとは異なるため、いくつか注意点があります。
さくらのレンタルサーバのHTTPS接続の仕様
さくらのレンタルサーバのHTTPS(SNI SSL)は、プロクシとして動作している(TCP/80のリバースプロクシとして動作している)仕様となっています。
参考
「さくらのレンタルサーバ」にて提供しているウェブサーバApacheは、 80番ポートを使用する(HTTP)ものと、 443番ポートを使用する(HTTPS)ものとの 2種類に分けられます。 また、後者についてはプロクシとして動作します。 一般的に、前者は「http://」、後者は「https://」という形式でアクセスしますが、 同じディレクトリへのアクセスであっても、その際に呼び出されるウェブサーバ が異なると、 CGIプログラムやウェブサーバが.htaccessなどのファイルを読み込む際、挙動に違いが生じます。
例えば、HTTPとしてアクセスした場合はお手元のコンピュータが、 HTTPSとしてアクセスした場合は サーバそのものがアクセス元となります。 このため、SSLのみのアクセス許可(HTTPアクセスの制限)や、mod_rewriteによるURLの書き換えはできません。
リバースプロキシによる影響
前述の通り、さくらのレンタルサーバはリバースプロキシによるHTTPS接続となっています。
その影響として、VPSや専用サーバ上でApache等のWebサーバを立ち上げた場合(プロクシ等を経由せず直接サーバとHTTPSで接続可能な状態)のように、.htaccessでRewriteCond %{HTTPS}を用いたHTTPS接続の判定や、PHPで$_SERVER['HTTPS']を用いたHTTPS接続の判定が行えません。(リバースプロキシ経由の接続となり、実行されたファイルからはHTTPで接続されたものと見えるため)
また、実行ファイルから見たURL(URI)は、https://www.example.com/〜 ではなく、http://www.example.com/〜 となりますので、例えばPHPの$_SERVER['REQUEST_URI']で現在のURLを取得するようなシステムは正常に動作せず、遷移後のURLがHTTPSではなく、HTTPになってしまう(URLが勝手にHTTPになるように見える)等の問題が発生します。
Wordpressにおける影響
WordpressをHTTPSで運用する場合、通常は(VPSや専用サーバ等では)WP_HOMEおよびWP_SITEURLの値をデータベースまたはwp-config.phpいずれの変更だけでHTTPSでのサイト公開が行えますが、さくらのレンタルサーバにおいてはこの設定だけでは「https→httpに勝手にリダイレクトされる」問題が生じます。
原因は前述の通りとなりますが、これに対処するため.htaccessとwp-config.phpに対する設定変更が必要となります。詳細は下記の通りとなります。
対応手順
※環境ごとの設定は適宜変更してください。
まず、Wordpress設置時に追加する(パーマリンク設定時に生成される).htaccessの先頭に、以下の設定を追加します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
</IfModule>
次に、wp-config.phpの先頭に以下の内容を追加します。
if( isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) ) {
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
$_SERVER['HTTP_HOST'] = 'www.example.com';
$_SERVER['SERVER_NAME'] = 'www.example.com';
$_ENV['HTTP_HOST'] = 'www.example.com';
$_ENV['SERVER_NAME'] = 'www.example.com';
}
設定例
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://www.example.com/$1 [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
<?php
/**
* The base configurations of the WordPress.
*
* このファイルは、MySQL、テーブル接頭辞、秘密鍵、言語、ABSPATH の設定を含みます。
* より詳しい情報は {@link http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86
* wp-config.php の編集} を参照してください。MySQL の設定情報はホスティング先より入手できます。
*
* このファイルはインストール時に wp-config.php 作成ウィザードが利用します。
* ウィザードを介さず、このファイルを "wp-config.php" という名前でコピーして直接編集し値を
* 入力してもかまいません。
*
* @package WordPress
*/
// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.sourceforge.jp/Codex:%E8%AB%87%E8%A9%B1%E5%AE%A4 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。
// プロクシでIPが入るとSSLアクセス状態をセットする
if( isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) ) {
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
$_SERVER['HTTP_HOST'] = 'www.example.com';
$_SERVER['SERVER_NAME'] = 'www.example.com';
$_ENV['HTTP_HOST'] = 'www.example.com';
$_ENV['SERVER_NAME'] = 'www.example.com';
}
// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'DB名');
/** MySQL データベースのユーザー名 */
define('DB_USER', 'DBユーザー名');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'DBパスワード');
/** MySQL のホスト名 */
define('DB_HOST', 'DBサーバ');
/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8');
/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');
/**#@+
* 認証用ユニークキー
*
* それぞれを異なるユニーク (一意) な文字列に変更してください。
* {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。
* 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。
*
* @since 2.6.0
*/
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
/**#@-*/
/**
* WordPress データベーステーブルの接頭辞
*
* それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
* インストールすることができます。半角英数字と下線のみを使用してください。
*/
$table_prefix = 'wp_prefix';
/**
* ローカル言語 - このパッケージでは初期値として 'ja' (日本語 UTF-8) が設定されています。
*
* WordPress のローカル言語を設定します。設定した言語に対応する MO ファイルが
* wp-content/languages にインストールされている必要があります。例えば de_DE.mo を
* wp-content/languages にインストールし WPLANG を 'de_DE' に設定することでドイツ語がサポートされます。
*/
define('WPLANG', 'ja');
/**
* 開発者へ: WordPress デバッグモード
*
* この値を true にすると、開発中に注意 (notice) を表示します。
* テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
*/
define('WP_DEBUG', false);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');