web-dev-qa-db-ja.com

nginx.confを設定して、特定のファイルまたはディレクトリ以外のすべての接続を拒否する

いくつかの任意のディレクトリとファイルを除いて、数値IPへのすべての接続が拒否されるようにNginxを設定しようとしています。したがって、誰かが私のIPにアクセスすると、たとえばindex.phpファイルやphpmyadminディレクトリへのアクセスは許可されますが、他のディレクトリへのアクセスは拒否されます。

これはnginx.confのサーバーブロックです。

server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm index.php;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME /srv/http/nginx/$fastcgi_script_name;
            include        fastcgi_params;
        }
}

どのように進めますか?どうもありがとう!

5
Ben

最も簡単な方法は、すべてのアクセスを拒否してから、必要なディレクトリへのアクセスのみを許可することです。 ring0が指摘したように、listenディレクティブでデフォルト(0.8ではdefault_server)フラグを使用できます。ただし、ホストへの不明な名前付きアクセスのデフォルトとして使用するサーバーがすでにある場合は、ホストヘッダーなしで、またはサーバーのIPアドレスを使用して、次のようなリクエストをキャッチすることもできます(1.2.3.4をサーバーのIP:

upstream _php {
  server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
  server_name "" 1.2.3.4;

  root /path/to/root;
  index index.php;

  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  # deny everything that doesn't match another location
  location / { deny all; }

  # allow loading /index.php
  location = / { } # need to allow GET / to internally redirect to /index.php
  location = /index.php { fastcgi_pass _php; }

  # allow access to phpmyadmin
  location /phpmyadmin/ { } # Allow access to static files in /phpmyadmin/
  location ~ ^/phpmyadmin/.*\.php$ { fastcgi_pass _php; } # phpmyadmin php files
}

fastcgi_paramsはfastcgi_passの両方の場所に継承され、/ index.phpと/ phpmyadmin /のみが許可されます。また、phpのアップストリームブロックを追加しました。これにより、将来追加または変更する必要が生じた場合に、より簡単になります。

9
kolbyjack

場所の創造的な使用と正規表現で否定されたルールの拒否。

    location / {
        root   html;
        index  index.html index.htm index.php;
    }

    location ~* !^/(index.(php|html|htm)$)|(phpmyadmin/) {
        deny all;
    }

    location ~ \.php$ {
        root           html;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /srv/http/nginx/$fastcgi_script_name;
        include        fastcgi_params;
    }

それはテストされていませんが、あなたはアイデアを得ます。

http://wiki.nginx.org/HttpAccessModule

http://wiki.nginx.org/HttpCoreModule#location

また、これはあなたがそれを書くのを助けるかもしれません:

http://www.regextester.com/

3
user15590

ドメイン名で呼び出されるserversを宣言し、直接IPアクセスを含むdefaultサーバーを宣言する方が簡単です。

たとえば、ドメイン構成は、たとえばmydomain.comに使用できます。

server {
        listen       80;
        server_name  mydomain.com *.mydomain.com;
        root /var/www/html/mydomain.com
        ...

通常のファイルを/var/www/html/mydomain.comディレクトリに配置します。

また、デフォルトのエントリでは、別の場所にある特定のファイルへのアクセスしか許可されません。
listen 80の後にdefaultキーワードがあることに注意してください。

server {
        listen       80 default;
        server_name  _ *;
        root /var/www/html/restricted
        ...

そして、デフォルトのファイルを/var/www/html/restrictedに入れます。これは、localhostおよび未加工のIPアドレス用に提供されます。

1
Ring Ø

Index.phpへのすべてのパスを直接設定し、このファイルのみに設定することができますnginxのfastcgi php7

    //redirect all to index.php
    location / {
        autoindex off;
        set $redirect_url $uri;
        try_files $uri $uri/ /index.php$is_args$query_string;
    }

    location = /index.php {
        include fastcgi.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;

        //Extra Params script PHP
        fastcgi_param PATH_INFO $redirect_url;
        fastcgi_param HTTP_Host $server_name;
    }
0