我正在尝试设置 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
另外,这也许能帮助你写它:
答案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;
}