【问题标题】:Force https for all server blocks in https context对 https 上下文中的所有服务器块强制使用 https
【发布时间】:2018-05-16 16:54:16
【问题描述】:

我是第一次尝试 nginx,我是用 docker 来做的。 基本上我想实现如下架构

我在启动时生成了带有一些环境变量的/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,我在阅读了它们需要什么后简单地复制和粘贴。

【问题讨论】:

  • httpshttp 的扩展,因此在某种程度上它是不同的协议。您的服务器不期望 http 在 :80,它期望 https(带有 listen 80 ssl),因此,错误。您需要在 :80 上接受 http 并配置 nginx 以将所有这些请求重定向到 https on :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 哦,球童看起来很有前途!我一定会试一试的。非常感谢!您可以参考那篇文章中的方法来制定答案,我会为此感谢您。成功了!

标签: docker nginx proxypass


【解决方案1】:

https 协议是http 的扩展,因此它们在一定程度上是不同 协议。目前,您的服务器不期望 http 在 :80 上,而是由于设置 listen 80 ssl 而期望 https。这会导致错误。

您需要将 :80 上的 http 请求的处理与 :443 上的 https 处理分开,该请求应重定向到 :443 上的 https

这可以通过在 :80 上为 http 拆分另一个 server 配置块来完成:

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

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2022-01-19
    • 1970-01-01
    • 2016-06-02
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多