在https上下文中强制所有服务器块的https

时间:2018-05-16 08:27:39

标签: docker nginx proxypass

我第一次尝试使用nginx,而且我是用docker做的。 基本上我想实现以下架构

我在启动时生成带有一些环境变量的/etc/nginx/conf.d/default.conf文件。然后该文件包含在default.conf文件的http上下文中,从而对我可以配置的内容带来一些限制。 (related issue

您可以看到我当前的nginx.conf file here(文件非常大,可以嵌入此处)。

你可以看到docker-compose.yml file here

问题:

400错误请求将纯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...
}

有关我的实际配置的任何建议都非常欢迎在评论部分!我刚开始使用nginx,因此阅读提供代码片段的tons of artciles,我只需在阅读完所需内容后进行复制和粘贴。

1 个答案:

答案 0 :(得分:2)

https协议是http的扩展,因此它们在某种程度上是不同的协议。目前,您的服务器不希望http开启:80,由于设置为https,因此需要listen 80 ssl。这会导致错误。

您需要将http请求的处理单独处理:80,应该重定向到https on:443,处理https on:443,应该正常处理。

这可以通过在{80}上分割出server的另一个http配置块来完成:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

...并从当前区块中删除监听:80:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    # more code...
}

以下博客文章根据需要提供了更多详细信息https://bjornjohansen.no/redirect-to-https-with-nginx