【问题标题】:Nginx dynamic proxy_pass with variable location and relative url具有可变位置和相对 URL 的 Nginx 动态 proxy_pass
【发布时间】:2021-11-03 15:25:51
【问题描述】:

我使用了这个 Nginx 配置,一切顺利。

server {
             listen       80;
             server_name  127.0.0.1;
             ssl_client_certificate /etc/ssl/certs/server.crt;
             add_header X-Frame-Options SAMEORIGIN;
             add_header X-Content-Type-Options "nosniff";

             location ^~ /api/ {
                       rewrite /(.*) /proxy/$1;           
                    }

             location ^~ /js/ {
                       rewrite /(.*) /proxy/$1;
                    }

             location ^~ /services/ {
                       rewrite /(.*) /proxy/$1;
                    }

             location ^~ /payeewebv2/ {
                       rewrite /(.*) /proxy/$1;
                    }


             location /proxy/ {                      
                     proxy_set_header X-SSL-CERT        $ssl_client_escaped_cert;
                     proxy_set_header X-Real-IP         $remote_addr;
                     proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;                    
                     proxy_pass https://proxieddomain.com/;
                     proxy_ssl_server_name on;
                     proxy_set_header host $proxy_host;

                 }
                }

现在我需要代理由 COOKIE 确定。我已经更新了配置,它看起来像这样:

server {
             listen       80;
             server_name  127.0.0.1;
             ssl_client_certificate /etc/ssl/certs/server.crt;
             add_header X-Frame-Options SAMEORIGIN;
             add_header X-Content-Type-Options "nosniff";

             location ^~ /api/ {
                       rewrite /(.*) /proxy/$1;           
                    }

             location ^~ /js/ {
                       rewrite /(.*) /proxy/$1;
                    }

             location ^~ /services/ {
                       rewrite /(.*) /proxy/$1;
                    }

             location ^~ /payeewebv2/ {
                       rewrite /(.*) /proxy/$1;
                    }


             location /proxy/ {                      
                     resolver 127.0.0.11;
                     set $proxy "to_be_replaced";
                     proxy_set_header X-SSL-CERT        $ssl_client_escaped_cert;
                     proxy_set_header X-Real-IP         $remote_addr;
                     proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
                     set_by_lua_block $proxy {
                        return "https://proxieddomain.com/"
                      }
                     proxy_pass $proxy$request_uri;
                     proxy_ssl_server_name on;
                     proxy_set_header proxy $proxy$request_uri;
                     proxy_set_header host $proxy_host;

                 }
                }
           }

这是更改的部分:

set_by_lua_block $proxy {
                            return "https://proxieddomain.com/"
                          }
proxy_pass $proxy$request_uri;

我可以访问http://localhost/varicent/,它代理https://proxieddomain.com/

但是当它的 javascript 请求 /api/something 等时,它会返回来自 $proxy (https://proxieddomain.com/) 的内容,而不是来自 $proxy/api/something (https://proxieddomain.com/api/something) 的内容。

您知道为什么第一个非动态解决方案可以毫无问题地工作吗? 我应该改变什么才能让它像以前一样工作? 谢谢

【问题讨论】:

  • $request_uri nginx 变量不会被rewrite 指令改变,它是一个$uri 。尝试将return "https://proxieddomain.com/" 更改为return "https://proxieddomain.com"(删除尾部斜杠)并将proxy_pass $proxy$request_uri; 更改为proxy_pass $proxy$uri$is_args$args;
  • 我尝试更改它,现在访问 https://localhost/payeewebv2/1 时得到 502。这是 nginx 日志:nginx_1 | 2021/11/02 20:59:04 [error] 13#13: *60 proxieddomain.com could not be resolved (3: Host not found), client: 127.0.0.1, server: 127.0.0.1, request: "GET /proxy/api/v1/customName HTTP/1.0", host: "localhost", referrer: "https://localhost/payeewebv2/1"
  • 您从哪里获得 127.0.0.11 解析器 IP 地址?通常它是一个 docker-compose 内部解析器,用于解析容器名称,而不是真正的域名具有该 IP 地址。尝试任何真正的 DNS 解析器,例如 google 8.8.8.8 之一(或使用您自己的 DNS)。
  • 不走运,8.8.8.8 和 127.0.0.11 都无法解决。
  • 您的代理域名是否可以通过互联网解析?你可以试试resolver 8.8.8.8 ipv6=off吗?

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


【解决方案1】:

问题出在真正的领域。 我通过 nslookup 查找并更改了配置以使用与 https://proxieddommain.com 不同的规范名称。 谢谢@IvanShatsky 的提示。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多