nginx同一个端口监听不同请求

根据不同域名进行区分

  1. 当不同域名解析到同一个IP,对于同一个端口,需要根据不同访问来源返回不同内容时,可添加多个 server 块, 区分不同的 server_name ,实现一端口多用的功能。
  2. server_name 为IP时可匹配通过IP访问的请求。
  3. 设置 default_server 为兜底逻辑,没匹配到任何 server 块时生效。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
server {
    listen 20080;
    server_name ci.d.me;

    location  / {
        return 200 "ci.d.me";
        add_header Content-Type text/plain;
    }
}


server {
    listen 20080;
    server_name "192.168.10.8";

    location  / {
        return 200 "ip.ip.ip";
        add_header Content-Type text/plain;
    }
}

server {
    listen 20080;
    server_name "d12.lo";
    root /var/www/html/dist/;
    index index.html index.htm default.php default.htm default.html;

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


server {
    listen 20080 default_server;
    server_name _;

    location  / {
        return 404;
    }
}

根据访问上下文进行区分

  1. 正常访问时,返回A响应。
  2. 当访问预设的一个特殊路径/xxx后,通过cookie或redis设置状态,在有效期内返回B响应。
  3. 比如正常访问时,反代到本地8899端口,当10分钟内访问了 /1panel 地址后,反代到本地17556端口。
  4. 示例中使用了cookie的方式,这种方式也可通过本地修改cookie的方式控制访问目标,如果想完全由服务端控制这一过程,可通过redis缓存实现。
  5. 使用cookie的方式,也可在服务端删除自动设置cookie的配置,完全由本地自行添加,这种形式cookie中的变量起到了密码的作用。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
map $cookie_visit_ctx $proxy_target {
    default http://127.0.0.1:8899;
    panel http://127.0.0.1:17556;
}

server {
    listen 20080;
    server_name d.me;

    location / {
        proxy_pass $proxy_target;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /0 {
        add_header Set-Cookie "visit_ctx=default; Max-Age=60; Path=/; HttpOnly";
        add_header Content-Type text/plain;
        return 200 "reset successful";
    }

    location /1panel {
        add_header Set-Cookie "visit_ctx=panel; Max-Age=600; Path=/; HttpOnly";
        add_header Content-Type text/plain;
        return 200 "nick done. 10 mins";
    }
}
updatedupdated2026-02-052026-02-05