遇到了一个我以前从未见过的问题。
在我的 nginx 配置中,我为单个子域设置了一个服务器块,该子域仅在端口 443(ssl)上监听。
但是,当我使用端口 80 测试连接时,它仍然有响应。现在非常令人困惑。
例如,curl http://blog.omgtrolls.com
不应该能够连接,但它确实连接了,并且输出了站点 html 等。以详细模式运行curl -v
显示它确实正在完成 80 上的连接。
curl -v http://blog.omgtrolls.com
* Trying 2607:f8b0:4005:814::200e...
* Connected to blog.omgtrolls.com (2607:f8b0:4005:814::200e) port 80 (#0)
> GET / HTTP/1.1
> Host: blog.omgtrolls.com
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 28 Apr 2023 01:02:17 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET
< Strict-Transport-Security: max-age=31536000;
<
* Connection #0 to host blog.omgtrolls.com left intact
<html>blah blah</html>
curl https://blog.omgtrolls.com
当然可以按预期工作。
这是我的设置的简化版本:
我最近_default.nginx
在标准设置中添加了一个新配置。(我有一个配置存储库,部署到几个不同的服务器。_default.nginx
部署到所有服务器。此配置旨在防止指向同一服务器 IP 的域名被其他托管站点提供服务。
我想也许这可能与这个新问题有关。
# _default.nginx
# default server config to prevent undefined domains from returning responses.
server {
listen 80 default_server;
server_name _;
return 404;
}
接下来,我为有问题的子域准备了一个不同的 nginx 配置文件。以下是简单版本(更改了域名以保护无辜者):
# omgtrolls.nginx
upstream nodejs_upstream{
server 127.0.0.1:3000;
}
server {
server_name blog.omgtrolls.com;
listen [::]:443 ssl;
root /usr/local/apps/omgtrolls/;
add_header Strict-Transport-Security "max-age=31536000;" always;
# required for LetsEncrypt
location ~ /.well-known {
allow all;
}
ssl_certificate /etc/letsencrypt/live/omgtrolls.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/omgtrolls.com/privkey.pem;
location / {
proxy_redirect off;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_cache off;
proxy_cache_key sfs$request_uri$scheme;
proxy_pass http://nodejs_upstream;
}
}
请注意我不有一个服务器块来捕获端口 80 请求并将其升级到 443。一旦我注意到此问题,我就专门禁用了该位。
什么应该发生的情况是,我只能通过 https/443 进行连接,否则连接将失败。
我的设置有什么问题_default.nginx
导致了这种情况吗?