我正在使用 Docker 设置服务器。一个容器运行配置了 SSL 的 nginx 镜像。第二个容器与一个简单的 Node 应用程序一起运行(在端口 3001 上)。我已经让两个容器通过 --link docker 参数进行通信。
我需要将所有 HTTP 请求重定向到 HTTPS。查看其他线程和在线资源,我发现返回 301 https://$host$request_uri
。当我输入http://localhost时在浏览器中,我在浏览器中获取上游的名称( https://node_app 而不是 https://localhost )。在不定义 server_name 或显式定义域的情况下如何成功重定向?
编辑:我应该澄清一下访问 https://localhost直接在浏览器中工作。 HTTP 没有。
这是我的 nginx.conf 文件:
worker_processes 1;
events { worker_connections 1024; }
http {
upstream node_app {
server node:3001;
}
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass http://node_app/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
最佳答案
看起来一切都很好。尝试了一些curl调用以确保 header 设置正确(感谢@RichardSmith的推荐)。还在不同浏览器中进行了测试。一切顺利!事实证明我需要清除我的主浏览器的缓存。不知道为什么,但它解决了问题!
对于任何有兴趣控制 nginx 301 重定向缓存的人:https://serverfault.com/questions/394040/cache-control-for-permanent-301-redirects-nginx
关于node.js - Docker nginx 将 HTTP 重定向到 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40066217/