设置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; } } 

我将如何继续? 非常感谢!

最简单的方法是首先拒绝所有访问,然后只允许访问你想要的目录。 正如ring0指出的那样,你可以使用listen指令中的默认(default_server in 0.8)标志。 但是,如果你已经有了一个服务器作为你的主机的未知命名访问的默认服务器,那么你也可以在没有主机头的情况下或者在你的服务器的IP地址上使用类似的东西来捕获请求(用你的1.2.3.4replace服务器的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的两个位置inheritance,并且只允许/index.php和/ phpmyadmin /。 我还为php添加了一个上游块,如果您将来需要添加或更改它,这会使其变得更容易。

正则expression式的创造性使用和否定规则在正则expression式中被否定,如下所示:

  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; } 

这是未经testing,但你明白了。

http://wiki.nginx.org/HttpAccessModule

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

另外,这可能会帮助你写出来:

http://www.regextester.com/

声明使用域名调用的服务器比较容易,并声明一个包含直接IP访问的默认服务器。

例如,您的域configuration可以用于,比如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 ,这个文件将被用作localhost和原始IP地址。