質問: /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /var/www/html/domain; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/domain/$fastcgi_script_name; include fastcgi_params; } } /var/www/html/domain/wp-admin/以下へのアクセスはユーザーエージェントにChromeが含まれていなければ404エラーを返したいです。 どのように記述すればよいでしょうか。 ご教示頂けますと幸いです。 宜しくお願いいたします。
回答: ユーザーエージェントは環境変数の`$http_user_agent`で取得できます。 ただ、偽装できるので注意が必要です。 状況に合わせて利用しましょう。 ユーザーエージェントについて、先に少し確認します。 * Chromeのユーザーエージェントは、"Chrome"という文字列で判定します。 * しかし、Microsoft Edgeもユーザーエージェントに"Chrome"という文字列を持っています。 * Microsoft Edgeは"Edge"という文字列を持っています。 では、これらを踏まえて、制限する場合を考えてみます。 条件 制限する場合を考えると、まずは次の条件を満たす必要があります。 条件A: /wp-admin/以下をリクエストする場合 次に、条件Aを満たしつつ、以下の2つのどちらかを満たす場合、制限することになります。 条件B:ユーザーエージェントが"Chrome"という文字列を持たない場合 条件C:Microsoft Edgeである場合。("Edge"という文字列を持つ場合) つまり「AかつB」または「AかつC」の場合に制限することになります。 例 下記のコードは設定の一例です。`location ~ \.php$ { }`の中に追記しています。 本来は`location ^~ /wp-admin/`とする方がいいと思いますが、php-fpmへの渡し方がよく分からないので、`location ~ \.php$`で全て処理しています。 Nginxはif文をネストできないので、文字列を結合して判定に利用しています。 ``` location ~ \.php$ { set $ua_check ""; if ($request_uri ~ ^/wp-admin/) { set $ua_check "A"; } if ($http_user_agent !~* Chrome) { set $ua_check "${ua_check}B"; } if ($http_user_agent ~* Edge) { set $ua_check "${ua_check}C"; } if ($ua_check = "AB") { return 404; } if ($ua_check = "AC") { return 404; } root /var/www/html/domain; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/domain/$fastcgi_script_name; include fastcgi_params; } ``` その他 locationディレクティブの`root /var/www/html/domain;`をserverディレクティブに出してもいいと思います。 それと、`fastcgi_param`の`/var/www/html/domain`は`$document_root`で代替できます。