首页 > 解决方案 > 使用proxy_pass根据headers转发http请求

问题描述

我正在使用 ip6tables 和 nginx 的组合来处理来自客户端的 http 请求。nginx 服务器侦听 8081 端口,并且必须在检查标头后转发请求。

客户端可以发送两种类型的请求:

  1. 没有标题的 GET/POST。这些应重定向到https://jaguar.mydomain.com
  2. GET/POST 带有特定的标头elb-jaguar.mydomain.com。这些应重定向到https://elb-jaguar.mydomain.com

运行 as 时nginx -c /home/build/v6-only.conf,nginx 失败,因为一个server{}指令已经listen在端口上8081

nginx: [emerg] duplicate listen options for [::]:8081 in /etc/nginx/v6/v6-only.conf:13

我的配置如下:

server {
    listen [::]:8081 ssl ipv6only=on;
    server_name elb-jaguar.mydomain.com;
    ssl_certificate /etc/ssl/elb.crt;
    ssl_certificate_key /etc/ssl/elb.key;

    location / {
        proxy_pass https://elb-jaguar.mydomain.com:443;
    }
}

server {
    listen [::]:8081 ssl ipv6only=on;
    ssl_certificate /etc/ssl/regular.crt;
    ssl_certificate_key /etc/ssl/regular.key;
    server_name jaguar.mydomain.com;

    location / {
        proxy_pass https://jaguar.mydomain.com:443;
    }
}

如何修复上述配置以获得所需的转发proxy_pass

标签: nginxnginx-reverse-proxy

解决方案


很难看到,因为该设置应该可以工作。

但是仔细研究NGINX 文档和您对 IPv6 的需求,它说(我的重点):

ipv6only=开|关

此参数 (0.7.42) 确定(通过 IPV6_V6ONLY 套接字选项)侦听通配符地址 [::] 的 IPv6 套接字是仅接受 IPv6 连接还是同时接受 IPv6 和 IPv4 连接。该参数默认开启。它只能在启动时设置一次

因为错误消息抱怨“重复侦听选项”,而不是“已经在该端口上侦听”或类似内容,所以它表明它在抱怨尝试设置ipv6only第二次(即使是相同的值)。

此外,它确实说此参数默认打开,因此您可以轻松地将其完全删除,如果只是尝试一下。


推荐阅读