【问题标题】:In nginx why I'm unable to use a web address as a proxy pass which is already used as a proxy pass在 Nginx 中,为什么我无法将网址用作已用作代理通行证的代理通行证
【发布时间】:2022-01-29 18:33:49
【问题描述】:

我的 nginx 配置中有以下服务器块:

server {
        listen 80; #default_server;
        listen [::]:80; #default_server;

        client_max_body_size  20M;
        client_header_timeout 600;
        client_body_timeout   600;
        keepalive_timeout     600;
        server_name example1-proxy.in;

    location / {
                proxy_pass http://example1.in;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Forwarded $proxy_add_forwarded;
                proxy_set_header X-Forwarded-For "";
                proxy_connect_timeout       600;
                proxy_send_timeout          600;
                proxy_read_timeout          600;
                send_timeout                600;
        }

}
server {
        listen 80; #default_server;
        listen [::]:80; #default_server;

        client_max_body_size  20M;
        client_header_timeout 600;
        client_body_timeout   600;
        keepalive_timeout     600;
        server_name example2-proxy.in;

    location / {
                proxy_pass http://example2.in;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Forwarded $proxy_add_forwarded;
                proxy_set_header X-Forwarded-For "";
                proxy_connect_timeout       600;
                proxy_send_timeout          600;
                proxy_read_timeout          600;
                send_timeout                600;
        }

}

我想在另一个 nginx 配置中将 example1-proxy 和 example2-proxy 配置为代理 pass,所以我做了以下操作:

server {
            listen 80; #default_server;
            listen [::]:80; #default_server;
    
            client_max_body_size  20M;
            client_header_timeout 600;
            client_body_timeout   600;
            keepalive_timeout     600;
            server_name example5.in;
    
        location /temp1/ {
                    proxy_pass http://example1-proxy.in;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header Forwarded $proxy_add_forwarded;
                    proxy_set_header X-Forwarded-For "";
                    proxy_connect_timeout       600;
                    proxy_send_timeout          600;
                    proxy_read_timeout          600;
                    send_timeout                600;
            }
            location /temp2/ {
                    proxy_pass http://example2-proxy.in;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header Forwarded $proxy_add_forwarded;
                    proxy_set_header X-Forwarded-For "";
                    proxy_connect_timeout       600;
                    proxy_send_timeout          600;
                    proxy_read_timeout          600;
                    send_timeout                600;
            }
    
    }

当我点击 url http://example5.in/temp2 时,应该调用 http://example2-proxy.in 但我收到以下错误:

{
    "timestamp": 1643470058798,
    "status": 403,
    "error": "Forbidden",
    "message": "Access Denied",
    "path": "/temp2/some path to api "
}

我不明白为什么上述配置不起作用,请提出任何解决方案。

【问题讨论】:

  • 看起来您的后端不理解那些 /temp1/temp2 URI 前缀。将您的 proxy_pass 指令更改为 proxy_pass http://example1-proxy.in/;proxy_pass http://example2-proxy.in/;。阅读this问题/答案了解更多信息。
  • 实际上问题是,当我通过邮递员触发example1-proxy/temp1 时,它可以工作,我认为第一个服务器块正在工作,因为当我颠倒服务器块的顺序时,example2-proxy/temp2 正在工作。我不知道默认情况下为什么它只需要第一个服务器块而不是第二个服务器块。

标签: linux nginx nginx-reverse-proxy nginx-config


【解决方案1】:

当您使用代理通行证时,NGINX 会查看目标 url, 如果它看到目标 url 不包含 URI(域名之后的部分,例如 /temp),这是您的情况,因为您正在转发到“http://example2-proxy.in”,那么 NGINX 将添加它的任何 URI最初收到到下一个服务器。 在您的情况下,这将导致对http://example2-proxy.in/temp2/的请求

如果您想向http://example2-proxy.in/发送请求,您需要指定目标服务器的URI,例如http://example2-proxy.in/

这是来自 NGINX 网站here 的快照:

【讨论】:

  • NGINX 文档的最后一段是重要的
【解决方案2】:

解决了,其实在第二个nginx配置中:

location /temp1/ {
                    proxy_pass http://example1-proxy.in;
                    proxy_set_header Host $host;

$host 应该被 example1-proxy.in 替换,只有这样这个服务器块才会被激活。所以正确的配置将是:

location /temp1/ {
                    proxy_pass http://example1-proxy.in;
                    proxy_set_header Host example1-proxy.in;

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2014-12-04
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2018-06-05
    • 2016-07-06
    相关资源
    最近更新 更多