【问题标题】:NGINX redirect to proxy (proxy pass) depending on location valueNGINX 根据位置值重定向到代理(代理通行证)
【发布时间】:2020-04-02 09:28:55
【问题描述】:

很简单的想法:

我想使用以下方案重定向到服务器:端口:

requesting domain.com/9000/blabla will proxy pass to 127.0.0.1:9000
requesting domain.com/9002/asdasd will proxy pass to 127.0.0.1:9002

我有以下单程规则:

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_pass http://127.0.0.1:9001;
}

但是如何将端口从路由名称作为变量获取到proxy_pass 参数?

另外,请注意,我需要通过代理请求的 url 应该全部在原始路由的端口号之后,所以:

domain.com/9000/blabla

请求的网址不应是/9000/blabla,而是/blabla

我希望这一切都可以通过 nginx 实现。非常感谢!

卷曲输出:

curl -v "https://dd.aa.com/9001/dada"
*   Trying XXXXX.XXX.XXX.XXX...
* TCP_NODELAY set
* Connected to dd.aa.com (XXXXX.XXX.XXX.XXX) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Client hello (1):
* TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=dd.aa.com
*  start date: Apr  2 08:20:16 2020 GMT
*  expire date: Jul  1 08:20:16 2020 GMT
*  subjectAltName: host "dd.aa.com" matched cert's "dd.aa.com"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* Using Stream ID: 1 (easy handle 0x55b7e45d5580)
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
> GET /9001/dada HTTP/2
> Host: dd.aa.com
> User-Agent: curl/7.58.0
> Accept: */*
> 
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
< HTTP/2 308 
< server: nginx
< date: Thu, 02 Apr 2020 11:42:17 GMT
< content-type: text/html; charset=utf-8
< content-length: 303
< location: http://dd.aa.com/dada/
< access-control-allow-origin: *
< x-powered-by: PleskLin
< 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
* Connection #0 to host dd.aa.com left intact
<p>You should be redirected automatically to target URL: <a href="http://dd.aa.com/dada/">http://dd.aa.com/dada/</a>.  If not click the link.

【问题讨论】:

  • 您想要静态解决方案还是动态解决方案?
  • 动态。我不想手动设置每个端口,它应该工作的范围。所以我需要它用于端口 9000-9100
  • 试试:location ~ /(\d+/.*)$ { proxy_pass http://127.0.0.1:$1; }

标签: nginx server routes installation


【解决方案1】:

您可以使用正则表达式location 语句捕获端口号和URI。详情请见this document

端口号和URI之间的/已经在正确的位置,所以可以直接将捕获粘贴到proxy_pass语句中。

例如:

location ~ ^/(\d+)(/.*)$ { 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_redirect http://example.com/ https://example.com/$1/;
    proxy_pass http://127.0.0.1:$1$2$is_args$args;
}

【讨论】:

  • 这工作除了example.com/9001/poop ...对于所有其他在最后一个斜线之后有一个项目的项目,如example.com/9001/poop/nop。对于第一个示例,它不起作用,nginx 返回 404。即使 $is_args$args 它不起作用。
  • 检查访问和错误日​​志。了解 9001 处的服务是否正在重定向请求可能很有用。
  • https://example.com/9001/poop/ 是来自 Nginx 的 404(不是来自服务服务器)...但是 https://example.com/9001/poop 将被服务服务器重定向到 example.com/poop 这没有任何意义(服务服务器确实308重定向,不知道为什么)
  • 错了,https://example.com/9001/poop会被nginx重定向,然后是404
  • 使用 curl 获取 308 响应中 Location 标头的确切文本。您将需要它来制作 proxy_redirect 声明。
猜你喜欢
  • 2019-03-14
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2017-06-20
相关资源
最近更新 更多