我有一台服务器,上面有很多网站。配置是用 nginx 完成的。我安装了 phpmyadmin,并添加了一个域名以在导航器中打开它。我想限制访问,以便只有当我连接到我的个人网络或 VPN 时才能看到它。
我尝试了这个:
server {
allow X.X.X.X/24;
allow X.X.X.X/24;
deny all;
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/data/phpmyadmin;
index index.php;
server_name server_domain_or_IP domain-name.fr;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
ssl_certificate /fullchain.pem;
ssl_certificate_key /privkey.pem;
}
server {
listen 80;
listen [::]:80;
server_name domain-name.fr;
return 302 https://$server_name$request_uri;
}
但它不起作用......
我还尝试将允许/拒绝部分放在位置部分,而不是将其写在服务器部分:
location / {
try_files $uri $uri/ =404;
allow X.X.X.X/24; #local IP
allow X.X.X.X/24; #VPN IP
deny all;
}
它并没有解决问题...
有人知道怎么做吗?谢谢,
答案1
http://nginx.org/en/docs/http/request_processing.html#simple_php_site_configuration
nginx 首先搜索由文字字符串给出的最具体的前缀位置,而不考虑列出的顺序。在上面的配置中,唯一的前缀位置是“/”,由于它与任何请求匹配,因此它将被用作最后的手段。然后 nginx 按照配置文件中列出的顺序检查由正则表达式给出的位置。第一个匹配的表达式将停止搜索,nginx 将使用此位置。如果没有正则表达式与请求匹配,则 nginx 将使用先前找到的最具体的前缀位置。
/login
因此,只有当没有匹配的正则表达式时,此语句才会匹配。/login/login.php
例如,如果您访问,您location ~ \.php($|/)
将赢得谁来处理此请求的选举。
解决方案 1
要解决您的问题,请将此位置设置为php location
location ~* /login {
allow 5.80.29.130;
deny all;
}
解决方案 2
使用
location ^~ /login {
allow 5.80.29.130;
deny all;
}
http://nginx.org/en/docs/http/ngx_http_core_module.html#location解释^~
如果此前缀字符串位置匹配则禁用正则表达式匹配。
来源:服务器故障
答案2
我假设您只是不想让 phpmyadmin 从您的网络外部被访问。因此,如果是这种情况,我建议您只需更改此服务侦听的端口,该端口将只能从内部访问。另一个选项是阻止通过 ip 访问,这应该可以完成工作:
server {
...
location / {
allow 192.168.1.0/24;
deny all;
...
}
...
}
删除 nginx 中的所有访问规则 + ssl 重定向:
server {
listen 8443 ssl;
listen [::]:8443 ssl;
root /var/www/data/phpmyadmin;
index index.php;
server_name server_domain_or_IP domain-name.fr;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
ssl_certificate /fullchain.pem;
ssl_certificate_key /privkey.pem;
}