我在 LEMP 堆栈上运行 2 个网站,并将 nginx 配置为反向代理服务器。我已成功将 phpmyadmin 安装在我的一个网站根目录的根文件夹中。当我转到www.example.com/phpmyadmin,我可以在公共互联网和局域网上访问 phpmyadmin 登录页面。我想要做的是配置 nginx 以阻止任何不来自局域网的 phpmyadmin 流量。目前,我的站点根目录中还有一个 /admin 文件夹,并且我已成功设置了一种方法,以阻止所有不来自局域网的该文件夹流量。我认为使用与阻止 /admin/ 目录相同的 ngninx 虚拟配置行,从外部阻止 phpmyadmin 会很容易,但只需将位置更改为 /phpmyadmin 即可。但是,执行此操作时,phpmyadmin 仍然在本地网络上被阻止。
以下是我为 example.com 配置的 nginx 虚拟主机的相关部分。您可以看到哪些阻止配置有效,哪些无效,如注释中所述。帮我修复 #Not working 行。注意:我的服务器的本地 IP 地址是192.168.1.20
。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php;
location / {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php?$args;
}
# Disallow PHP In Upload Folder
location /wp-content/uploads/ {
location ~ \.php$ {
deny all;
}
}
# LAN ONLY ACCESS WORKING
location ^~ /admin {
allow 192.168.1.0/24;
deny all;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
# LAN ONLY ACCESS NOT WORKING!!!
location ^~ /phpmyadmin {
allow 192.168.1.0/24;
deny all;
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass local_php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass local_php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
}
我必须对虚拟主机配置文件进行哪些编辑才能正确地将 phpmyadmin 限制在 Nginx 中的 LAN 上?
答案1
试试这个,对我有用。
location ~phpmyadmin {
allow 192.168.1.0/24;
deny all;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
答案2
不幸的是,@JRA 的答案没有奏效。奏效的方法是将限制指令添加到 .conf 文件中服务器块的最顶部,而不将它们用作位置指令,如下所示...
server {
# Restrict access to LAN.
allow 192.168.1.0/24;
deny all;
error_page 403 =444;
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
# Restrict access to LAN.
allow 192.168.1.0/24;
deny all;
error_page 403 =444;
####
# SSL configuration
####
listen 443 ssl http2;
listen [::]:443 ssl http2;
...
答案3
你的问题是nginx 应用位置块的顺序。具体来说,~.php$ 位置在 ~/phpmyadmin 块之前进行处理。假设 phpmyadmin 目录位于您的 webroot 中,使用文字前缀而不是正则表达式应该会产生您期望的行为......
location /phpmyadmin {
尽管 /admin 目前的行为符合您的预期,但将其设为文字前缀也是一个好主意。