質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

1回答

2349閲覧

NginXのWordpress管理画面をユーザーエージェントでアクセス制限するには

happy_tera

総合スコア159

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2017/05/06 10:14

編集2017/05/06 10:16

/etc/nginx/conf.d/default.confは以下の設定になっています。

server {
listen 80;
server_name domain.jp;

location / { index index.html index.htm index.php; try_files $uri $uri/ /index.php?$args; root /var/www/html/domain; } error_page 500 502 503 504 /50x.html; location = /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エラーを返したいです。
どのように記述すればよいでしょうか。
ご教示頂けますと幸いです。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ユーザーエージェントは環境変数の$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文をネストできないので、文字列を結合して判定に利用しています。

Nginx

1location ~ \.php$ { 2 3 set $ua_check ""; 4 if ($request_uri ~ ^/wp-admin/) { 5 set $ua_check "A"; 6 } 7 if ($http_user_agent !~* Chrome) { 8 set $ua_check "${ua_check}B"; 9 } 10 if ($http_user_agent ~* Edge) { 11 set $ua_check "${ua_check}C"; 12 } 13 14 if ($ua_check = "AB") { 15 return 404; 16 } 17 if ($ua_check = "AC") { 18 return 404; 19 } 20 21 22 root /var/www/html/domain; 23 fastcgi_pass 127.0.0.1:9000; 24 fastcgi_index index.php; 25 fastcgi_param SCRIPT_FILENAME /var/www/html/domain/$fastcgi_script_name; 26 include fastcgi_params; 27}

その他

locationディレクティブのroot /var/www/html/domain;をserverディレクティブに出してもいいと思います。
それと、fastcgi_param/var/www/html/domain$document_rootで代替できます。

投稿2017/05/06 17:12

coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happy_tera

2017/05/10 01:22

ありがとうございました! とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問