WordPress管理画面にIP制限|Nginx版

WordPress
  • WordPressの管理画面にIP制限をかけたい
  • WebサーバーにはNginxを使っている

そんな方にオススメの内容です。

htaccess/Apacheの方はこちら
WordPress管理画面にIP制限|htaccess/Apache版

スポンサーリンク

自分のIPの調べ方

CMANのサイトにアクセスすれば自分のIPアドレスが表示される。
CMAN IPアドレス確認
IP制限をかける場合、許可するIPアドレスが必要なので控えておく。

Nginx設定ファイルの調整方法

wp-login.phpファイルとwp-adminディレクトリについてIP制限をかけ、wp-admin/admin-ajax.phpファイルについてはIP制限をかけてはいけない。
WordPressの公式サイトサーバーを守るにて記載がある。

WordPressに記載されているURLパスを考慮すると、locationディレクティブは次のようになる。
allowの右に自分のIPアドレスを記載してほしい。

    location ~ /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
        allow 100.100.100.100;
        deny all;
    }

次にphpファイルの設定も追加する。
Nginxでは正規表現に一致すると以降のlocationディレクティブは評価されない。
だから管理画面用のlocationディレクティブ内部にphpファイル用のlocationディレクティブを記載する必要があるんだ。
ただしphpファイル用のlocationディレクティブは既に存在するはずなので記述内容が重複してしまう。
そこでphpの設定は別ファイルに記載してincludeディレクティブを用いる。

まずphpファイル用のlocationディレクティブを編集する。
/etc/nginx/nginx.conf か /etc/nginx/sites-available/○○.conf に記載されているはず。

    location ~ \.php$ {
        ## ここに元々記載している内容をカット ##
        ## includeディレクティブを記載
        include snippets/fastcgi-php.conf;
    }

次に/etc/nginx/snippets/fastcgi-php.confを開いて先ほどカットした内容を貼り付ける。
元々ファイルが存在している場合は追記し、存在しない場合は新規作成して全て記載する。
参考までに僕の設定ファイルの内容を記載しておく。

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

Nginxの設定ファイルの完成形

WordPressの公式サイトを参考にした最終的な設定ファイルは次のようになる。
Nginxのlocationディレクティブの評価順の仕様から、location / と location ~ \.php$ の間に記載する必要があるから注意して欲しい。

sites-available/wordpress.confファイル

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    ## location / より後ろに追記
    location ~ /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {
        allow 100.100.100.100;
        deny all;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
        }
    }
    ## location ~ \.php$ より前に追記

    # pass PHP scripts to FastCGI server
    location ~ \.php$ {
        ## includeディレクティブを追記
        include snippets/fastcgi-php.conf;
    }

Nginxの再起動

最後にNginxを再起動させて設定を反映させる。

systemctl reload nginx

別のIPアドレスで接続、例えばWi-Fi接続を切ったスマホで確認してみてほしい。
管理画面へアクセスできないはずだ。