読者です 読者をやめる 読者になる 読者になる

WordPress をフロント Nginx のリバースプロキシ下で運用する場合に 管理画面を SSL に強制する設定

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 を編集します。

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 を有効にします。