Digital Ocean App Platform 应用程序的 Nginx 代理服务器收到 403 访问被拒绝 - Cloudflare 错误

问题描述 投票:0回答:3

我在尝试将请求从我的服务器代理到我的 Digital Ocean App Platform 应用程序时遇到问题。

我有一个 .NET 6 应用程序在 Digital Ocean 应用程序平台上的 Docker 容器中运行。这运行良好。我可以使用应用程序平台为我的应用程序提供的域从 REST 客户端成功访问我的 API。

我现在想做的是向运行 Nginx 的服务器添加一个条目,以代理从我的域到应用程序平台上的应用程序的请求。

这是我最初的 Nginx 配置。

server {
    listen              443 ssl;
    server_name         ~^(?<subdomain>[\w-]+)\.mydomain\.com$ mydomain.com;

    ssl_certificate      /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/mydomain.com/privkey.pem;

    location /api {
        proxy_pass              https://my-app-platform-app.ondigitalocean.app;
        proxy_http_version      1.1;
    }
}

这个初始配置工作正常,我的 api 收到请求,但我的 docker 容器中请求的主机标头是 Digital Ocean App Platform 分配的域 (my-app-platform-app.ondigitalocean.app),但希望我的域来自我的代理服务器 (mydomain.com) 作为主机标头。所以我所做的就是在 Nginx 配置中使用

Host
设置
proxy_set_header
标头,如下所示。

server {
    listen              443 ssl;
    server_name         ~^(?<subdomain>[\w-]+)\.mydomain\.com$ mydomain.com;

    ssl_certificate      /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/mydomain.com/privkey.pem;

    location /api {
        proxy_set_header        Host $host;
        proxy_pass              https://my-app-platform-app.ondigitalocean.app;
        proxy_http_version      1.1;
    }
}

现在,当我尝试从

mydomain.com/api
访问我的 API 时,我收到 403 Permission Denied - Cloudflare 错误。我相信这是来自 Digital Ocean App Platform 而不是我的代理服务器,但不知道如何找到根本原因。

有人在使用数字海洋应用平台时遇到过这个问题,或者知道我做错了什么吗?

谢谢你。

docker nginx proxy reverse-proxy digital-ocean
3个回答
2
投票

我没有使用 nginx,而是使用 haproxy,但看到了同样的行为。我让它工作的方法是首先将

X-Forwarded-For
标头设置为
Host
标头值。然后,我将
Host
标头值设置为数字海洋应用程序平台主机。

这让我的应用程序按预期响应。


1
投票

更新

我无法找到 403 Permission Denied Cloudflare 错误的原始错误的解决方案。我在数字海洋社区板上发帖,但在那里也没有任何运气。关于 Cloudflare 返回 403 的原因(返回带有 403 错误的空白页面,没有详细信息)的细节不多,我也无法在 Digital Ocean 中找到任何内容。我确实在数字海洋社区板上发现了一个问题,有同样的错误,但也没有任何解决方案。

我想我应该发布一个临时解决方案,将其用作解决方法,直到我可以进一步解决此问题。我没有设置

Host
标题,只是添加了一个新的自定义标题
X-Host
并将其设置为
$host
。这会正确传递到我在 Docker 容器中运行的 API。

在我的 .NET 6 应用程序中,我首先检查

X-Host
标头以查看它是否已设置,如果未设置,则使用
Host
标头作为后备。

我的 Nginx 配置现在看起来像这样......

server {
    listen              443 ssl;
    server_name         ~^(?<subdomain>[\w-]+)\.mydomain\.com$ mydomain.com;

    ssl_certificate      /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/mydomain.com/privkey.pem;

    location /api {
        proxy_set_header        X-Host $host;
        proxy_pass              https://my-app-platform-app.ondigitalocean.app;
        proxy_http_version      1.1;
    }
}

如果这是 CORS 请求,您可能必须在 Digital Ocean 中设置 CORS 策略。您可以按照下面的指南进行设置。

https://docs.digitalocean.com/products/app-platform/how-to/configure-cors-policies/

数字海洋社区问题

https://www.digitalocean.com/community/questions/nginx-proxy-server-to-app-platform-app-is-getting-a-403-access-denied-cloudflare-error


0
投票

我们最近通过调整应用程序平台路径代理的 nginx 配置解决了 nginx 反向代理(在 Digital Ocean Droplet 上运行)上的类似问题(错误 503)。具体来说,我们必须在位置块中添加proxy_ssl_server_name才能解决该错误。

location /conference {
    proxy_ssl_server_name on;
    proxy_pass https://icf-conference-2024-99rlp.ondigitalocean.app;
    proxy_set_header Host icf-conference-2024-99rlp.ondigitalocean.app;
}
© www.soinside.com 2019 - 2024. All rights reserved.