设置 nginx.conf 以拒绝除特定文件或目录之外的所有连接

设置 nginx.conf 以拒绝除特定文件或目录之外的所有连接

我正在尝试设置 Nginx,以便拒绝所有到我的数字 IP 的连接,但一些任意目录和文件除外。因此,如果有人访问我的 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;
        }
}

我该怎么做?非常感谢!

答案1

最简单的方法是先拒绝所有访问,然后只授予您想要的目录的访问权限。正如 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 添加了一个上游块,这样以后您需要添加或更改它时会更加方便。

答案2

创造性地使用正则表达式中否定的位置和拒绝规则,例如:

    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

更容易声明服务器使用域名调用,并声明默认包括直接 IP 访问的服务器。

例如,你的域配置可以用于:mydomain.com

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

将常规文件放在目录中/var/www/html/mydomain.com

默认条目仅允许访问不同位置的某些特定文件。
注意默认关键字之后listen 80

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

并且你把默认文件放进去/var/www/html/restricted,它将被服务于本地主机和原始 IP 地址。

答案4

您可以直接设置所有路径到 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;
    }

相关内容