【发布时间】: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_uringinx 变量不会被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 解析器,例如 google8.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