我设置的配置(如下)适用于localhost
我的域,但不适用于我的域。目标是使用基本认证所以只有我可以访问它。当我转到 时localhost
,它会升级为https
,我必须完成身份验证,然后才会显示端口 3000,正如它应该的那样。但是,转到api.example.com
不会提示身份验证,不会升级连接,只显示Invalid Host header
。当我打开端口 3000 进行端口转发并转到 时api.example.com:3000
,我可以访问该端口,但它不需要身份验证,不使用https
,我的目标是避免端口转发。这个配置来自说明,所以我不知道可能是什么问题。为什么我的子域不能使用此配置?
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream supabase {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name localhost *host IP* api.example.com;
access_log off;
rewrite ^ https://$host$request_uri? permanent;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name localhost *host IP* api.example.com;
ssl_certificate /etc/api.example.com/fullchain.pem;
ssl_certificate_key /etc/api.example.com/privkey.pem;
# STUDIO
location / {
auth_basic "Authentication Required";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_set_header Host $host;
proxy_pass http://supabase;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
}
}
防火墙:
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
80/tcp (Nginx HTTP) ALLOW IN Anywhere
80 ALLOW IN Anywhere
443 ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
8000 ALLOW IN Anywhere
80,443/tcp (Nginx Full) ALLOW IN Anywhere
443/tcp (Nginx HTTPS) ALLOW IN Anywhere
80/tcp (Nginx HTTP (v6)) ALLOW IN Anywhere (v6)
80 (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
8000 (v6) ALLOW IN Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
443/tcp (Nginx HTTPS (v6)) ALLOW IN Anywhere (v6)
答案1
您的 80 端口服务器块仅配置了名称localhost
。
server_name localhost;
这里缺少域名api.example.com
。因此,通过 HTTP 对该域名的请求被 nginx 默认配置中的默认服务器块捕获。
在此处添加域,就像在 SSL 服务器块中所做的那样。
server_name localhost api.example.com;
答案2
我怀疑您的 DNS 名称是否真的是 api.example.com - 但最好不要在此处发布它。但是,如果您提供的主机名无效 - 即包含除 az、0-9、'.' 和 '-' 之外的字符,则会出现此错误。这可能不是故意的 - 从名称列表中省略尾随的 ';' 可能会产生相同的结果。在这种情况下,nginx 将拒绝加载配置文件。其总是在应用之前测试您的配置是一个好主意nginx -t
;“systemctl reload nginx”不会告诉您您的配置不好。