【问题标题】:How do I fix an infinite redirect loop on a self-hosted nginx server?如何修复自托管 nginx 服务器上的无限重定向循环?
【发布时间】:2021-10-08 00:07:58
【问题描述】:

我正在学习如何使用 Python 和 Flask 构建和托管我自己的网站,但我无法让我的网站正常运行,因为当我尝试通过我的域名访问我的网站时,我不断收到无限重定向循环。

我使用 Python、Flask 和 Flask-Flatpages 制作了我的网站。我将代码上传到 GitHub 并将其拉到我家的 Raspberry Pi 4 上。我在 RasPi 上安装了 gunicorn 来为网站提供服务,并设置了两个工作人员来监听请求。我还设置了 nginx 作为反向代理并监听来自外部的请求。这是我的 nginx 配置:

server {
    if ($host = <redacted>.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    # listen on port 80 (http)
    listen 80;
    server_name <redacted>.com www.<redacted>.com;
    location ~ /.well-known {
        root /home/pi/<redacted>.com/certs;
    }
    location / {
        # redirect any requests to the same URL but on https
        return 301 https://$host$request_uri;
    }


}

server {
    # listen on port 443 (https)
    listen 443;
    ssl on;
    server_name <redacted>.com www.<redacted>.com;

    # location of the SSL certificate
    ssl_certificate /etc/letsencrypt/live/<redacted>.com/fullchain.pem; # m$
    ssl_certificate_key /etc/letsencrypt/live/<redacted>.com/privkey.pem; #$

    # write access and error logs to /var/log
    access_log /var/log/blog_access.log;
    error_log /var/log/blog_error.log;

    location / {
        # forward application requests to the gunicorn server
        proxy_pass http://localhost:8000;
        proxy_redirect off;
        proxy_set_header X_Forwarded_Proto $scheme;
        proxy_set_header Host $host;

    location /static {
        # handle static files directly, without forwarding to the application
        alias /home/pi/<redacted>.com/blog/static;
        expires 30d;
    }

}

当我通过输入 RasPi 的本地 IP 访问该网站时(我在 /etc/dhcpcd.conf 中设置了一个静态 IP 地址),该网站的服务很好,尽管我的浏览器似乎无法识别SSL 证书即使当我点击旁边的 Not Secure &gt; Certificate 时 Chrome 说证书是有效的。

为了公开网站,我将路由器上的端口 80 转发到 RasPi 并设置 ufw 以仅允许来自端口 80、443 和 22 的请求。我使用 GoDaddy 购买了一个域名,然后添加通过更改 GoDaddy 中的名称服务器将域添加到 CloudFlare(我计划稍后设置 cloudflare-ddns,这就是我首先将域添加到 CloudFlare 的原因)。作为临时解决方案,我已将路由器的当前 IP 添加到 CloudFlare DNS 设置中的 A 记录中,我希望在接下来的几天内保持不变。

当我尝试通过我的公共域名访问我的网站时,我的问题出现了。当我这样做时,我得到ERR_TOO_MANY_REDIRECTS,我怀疑这是由于我的 nginx 配置存在问题。我已经阅读了this post 并尝试将我的 CloudFlare SSL/TLS 设置从Flexible 更改为Full (strict)。然而,这导致了一个不同的问题,我得到一个CloudFlare error 522: connection timed outCloudFlare help page 中的解决方案似乎都不适用于我的情况,因为我已经确认:

  1. 我没有阻止ufw 中的任何 CloudFlare IP
  2. 服务器没有过载(我现在是唯一一个访问它的人)
  3. Keepalive 已启用(我没有更改任何默认设置,虽然我不确定它是否默认启用)
  4. DNS 表 A 记录中的 IP 地址与我的路由器的公共 IP 匹配(通过在 google 上搜索“我的 IP 是什么”找到)

如果这里有很多关于一个问题的问题,我们深表歉意,但我们将不胜感激!

【问题讨论】:

    标签: ssl flask raspberry-pi gunicorn nginx-reverse-proxy


    【解决方案1】:

    我只看到你的配置有一个明显的问题,那就是这个由 certbot 自动添加的块可能应该被删除:

        if ($host = <redacted>.com) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    

    因为该行为已在 location / {} 块中指定,并且我认为 Certbot 规则可能在 location ~ /.well-known 块之前生效并破坏该功能。我不确定这一点,我认为这不会导致重定向,但您可以通过尝试访问 http://yourhost.com/.well-known 并查看它是否重定向到 HTTPS 来自己测试众所周知的功能。

    就此而言,您的问题的直接答案是,获取有关正在发生的事情的更多信息!我的下一步是查看重定向循环是什么——您的浏览器可能会在其网络请求日志中显示这一点,或者您可以使用curlhttpie 或类似的命令行工具尝试通过以下方式访问您的站点主机名并查看正在发出的请求。它只是试图一遍又一遍地访问同一个 URL,还是循环访问多个 URL?这些是什么?那是什么意思?

    附带说明,Chrome 在通过 IP 访问它时不喜欢您的证书是有道理的 - 证书与一个或多个主机名相关联,因此当您通过 IP 地址访问它时,主机名不会' 不匹配,因此 Chrome 可能(正确地)指出了这一点并警告您您不在证书上说您应该使用的主机名。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多