Nginx をフロントにおいて高速化するのは常套手段ですが、そのときに WordPress の wp-admin(管理画面)は SSL を有効にしたいときの設定方法です。

Nginx の設定
# HTTP server
#
server {
listen 80;
location / {
proxy_redirect                          off;
proxy\_set\_header Host                   $host;
proxy\_set\_header X-Real-IP              $remote_addr;
proxy\_set\_header X-Forwarded-Host       $host;
proxy\_set\_header X-Forwarded-Server     $host;
proxy\_set\_header X-Forwarded-For        $proxy\_add\_x\_forwarded\_for;
proxy_pass  http://127.0.0.1:8080/;
}
}
\# HTTPS server
#
server {
listen 443;
ssl on;
ssl_certificate ssl/cert.pem;
ssl\_certificate\_key ssl/cert.key;
ssl\_session\_timeout 5m;
ssl_protocols  SSLv2 SSLv3 TLSv1;
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl\_prefer\_server_ciphers   on;
location / {
proxy_redirect                          off;
proxy\_set\_header Host                   $host;
proxy\_set\_header X-Real-IP              $remote_addr;
proxy\_set\_header X-Forwarded-Proto      https;
proxy\_set\_header X-Forwarded-Host       $host;
proxy\_set\_header X-Forwarded-Server     $host;
proxy\_set\_header X-Forwarded-For        $proxy\_add\_x\_forwarded\_for;
proxy_pass  http://127.0.0.1:8080/;
}
}

環境変数 HTTP_X_FORWARDED_PROTO を使って Nginx が受けたのは http か https かを後ろのサービスに伝えます。

WordPressの設定

wp-config.php を編集します。

1
2
3
4
5
6
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

上記を wp-settings.php の読み込み前に定義します。環境変数 HTTP_X_FORWARDED_PROTO に従って https ならば環境変数 HTTPS を有効にします。