【发布时间】:2018-05-16 16:54:16
【问题描述】:
我是第一次尝试 nginx,我是用 docker 来做的。 基本上我想实现如下架构
- https://example.com(商业网站`)
- https://app.example.com(progressive web / 单页应用)
- https://app.example.com/api(为避免预检请求,需要https://api.example.com 的代理)
- https://api.example.com (restful api)
- 每个
http请求被重定向到https
我在启动时生成了带有一些环境变量的/etc/nginx/conf.d/default.conf 文件。然后该文件包含在 default.conf 文件的http 上下文中,从而对我可以配置的内容带来了一些限制。 (related issue)
你可以看到我当前的nginx.conf file here(文件很大,可以在这里嵌入)。
你可以看到docker-compose.yml file here。
问题:
400 Bad Request 纯 HTTP 请求被发送到 HTTPS 端口
我实际上无法对http://(app/api).example.com 进行任何调用以重定向到其https 版本,我已经尝试过但没有成功:(请参阅上面的链接文件)
server {
listen 80 ssl;
listen 443 ssl;
listen [::]:80 ssl;
listen [::]:443 ssl;
server_name api.dev.local;
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
# more code...
}
任何关于我的实际配置的建议都非常欢迎在 cmets 部分!我刚刚开始使用 nginx,因此阅读了tons of artciles,它提供了代码 sn-ps,我在阅读了它们需要什么后简单地复制和粘贴。
【问题讨论】:
-
https是http的扩展,因此在某种程度上它是不同的协议。您的服务器不期望http在 :80,它期望https(带有listen 80 ssl),因此,错误。您需要在 :80 上接受http并配置 nginx 以将所有这些请求重定向到httpson :443 这是一个链接可以帮助您解决 bjornjohansen.no/redirect-to-https-with-nginx -
@OlegSklyar 所以另一个服务器块监听端口 80 并重定向应该可以完成这项工作吗?不是重写吗?我应该停止在同一个服务器块中同时收听 80 和 443 吗?
-
我会说是的,您需要另一个块用于纯 http 和 :80 进行简单的重定向,即返回 3xx 和 https url。在当前块中,您应该只留下:443 和 https,但不要留下:80。与链接下描述的差不多
-
提示:通过使用
caddy代替nginx,您将免费获得所有这些,包括通过 Let's Encrypt 的自动和免费认证。对于大型企业来说,这可能不是一个理想的解决方案,但对于单个应用程序或 beta 版本来说是一个不错的选择 -
@OlegSklyar 哦,球童看起来很有前途!我一定会试一试的。非常感谢!您可以参考那篇文章中的方法来制定答案,我会为此感谢您。成功了!