X-Forwarded-Host 在 nginx 中不起作用

Tic*_*Jit 3 nginx docker kubernetes

更新 2.我想将所有流量添加并转发到localhost/admin/而不是localhost/.

  • 应用程序监听这些路径:
    • localhost/(然后通过应用获取302 localhost/login),
    • localhost/overview,
    • localhost/books/details, ETC。
  • 我希望管理员用户使用这些网址:
    • localhost/admin/localhost/admin/login(通过申请获得302 )
    • localhost/admin/overview
    • localhost/admin/books/details
  • 使用我的反向代理(见下文):
    • localhost/admin/(我localhost/login通过申请得到了302)

,

我也可以使用ingrees-nginx-controller而不是安装文件。

在 docker nginx.conf 中(或类似于 k8s)

server {
    listen 80 default_server;
    listen [::]:80 default_server;
        ...
        location /admin {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host/admin;
        proxy_pass http://<conteiner2>.docker-network;
    }
    ... 
}
Run Code Online (Sandbox Code Playgroud)

Update1 对于 kubernetes,我正在尝试设置为此,ingress-nginx 我安装了并使用此 YAMLingress-nginx-controller设置:ingress-nginx

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "Host $host";
      more_set_headers "X-Real-IP $remote_addr";
      more_set_headers "X-Forwarded-For $proxy_add_x_forwarded_for";
      more_set_headers "X-Forwarded-Proto $scheme";
      more_set_headers "X-Forwarded-Host $host/admin";
  name: test-ingress
  namespace: <namespace>
spec:
  rules:
    - http:
        paths:
        - path: /admin
          backend:
            serviceName: <app1>-admin
            servicePort: 8002
Run Code Online (Sandbox Code Playgroud)

mda*_*iel 5

所以,这里发生了一些事情;最重要的是:

proxy_set_header X-Forwarded-Host $host/admin;
proxy_pass http://<conteiner2>.docker-network;
Run Code Online (Sandbox Code Playgroud)

是不正确的,因为x-forwarded-HOST不应包含uri,就像您所使用的那样/admin:它应该只是$host; 您真正想要的是更新proxy_pass以包含,$request_uri正如您可以观察到使用 nginx Ingress 控制器时生成的 nginx.conf 所做的那样。等待位置的 URI/admin以及该位置中的任何其他匹配项将按预期传递到上游:

proxy_set_header X-Forwarded-Host $host;
proxy_pass http://<conteiner2>.docker-network$request_uri;
# or you're free to hard-code /admin if you prefer:
proxy_pass http://<conteiner2>.docker-network/admin;
Run Code Online (Sandbox Code Playgroud)

其次,如果您希望将某些路由configuration-snippet:应用于一个 URI,而不是同时应用于两个 URI,则将这两个路由拆分为两个单独的 Ingress 资源,以便可以独立管理它们:

proxy_set_header X-Forwarded-Host $host/admin;
proxy_pass http://<conteiner2>.docker-network;
Run Code Online (Sandbox Code Playgroud)

有什么想法如何调试 nginx 代理吗?

有两种很好的方法:首先,获取生成的 nginx.conf 并仔细阅读它,看看您期望发生的情况与实际发生的情况:

kubectl cp ${the_nginx_controller_pod}:/etc/nginx/nginx.conf ingress-nginx.conf
Run Code Online (Sandbox Code Playgroud)

另一种方法是将nginx 日志级别设置为debug(如果您尝试在生产环境中进行调试,这可能会出现问题,因为它会生成绝对疯狂的文本量,但它几乎肯定会给出任何问题的实际答案)您正在尝试调试):

# the ConfigMap may be named differently in your setup:
$ kubectl edit configmap nginx-ingress-controller

# and add:
data:
   error-log-level: debug

# then wait a few seconds for nginx to notice the configmap change
# and if it doesn't, kill the controller pods to force the reload
Run Code Online (Sandbox Code Playgroud)