wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# ---------------------------------------------------------------------------
# 示例:Board 为 ASP.NET(Kestrel :3000,PathBase=/board),且使用 Negotiate/Windows 集成一键登录
# 与 board.conf 行为一致(80 入口、/board 直连 Board、其它路径 auth_request + DataEase),
# 仅在 /board/ 反代段增加与 SPNEGO/NTLM 相关的头与连接行为,便于浏览器与上游完成握手。
#
# 用法:复制为独立 conf(如 /etc/nginx/conf.d/board-negotiate.conf),勿覆盖现有 board.conf。
# 根据环境修改 server_name、upstream 地址与端口。
#
# 限制说明:
# - Negotiate/NTLM 对「连接亲和」敏感;经 nginx 反代时,部分客户端需多次往返。
# - 完全「无弹窗」依赖域/Kerberos/浏览器策略;非域机器可能仍出现凭据提示或失败。
# - 若一键登录仍异常,可改为 Board 仅由 IIS 托管(IIS 终结 Windows 身份),nginx 只反代到 IIS。
# ---------------------------------------------------------------------------
 
upstream board_app {
    server 127.0.0.1:3000;
}
 
upstream dataease_upstream {
    server 127.0.0.1:8100;
}
 
server {
    listen 80;
    server_name 192.168.0.235;
 
    location = /board {
        return 302 $scheme://$http_host/board/;
    }
 
    # Board:反代到 ASP.NET,并透传 Authorization(Negotiate/NTLM),避免被 nginx 吞掉
    location ^~ /board/ {
        proxy_pass http://board_app;
        proxy_http_version 1.1;
 
        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 Authorization $http_authorization;
        # 部分环境下上游会回传 Negotiate 质询,需原样带回客户端
        proxy_pass_header WWW-Authenticate;
 
        # 与部分 NTLM 客户端兼容:保持到上游的连接(按环境可配合 upstream keepalive)
        proxy_set_header Connection "";
 
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
 
    location = /internal/board_check {
        internal;
        proxy_pass http://board_app/board/check/;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header Host $host;
        proxy_set_header X-Original-URI $request_uri;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Cookie $http_cookie;
    }
 
    location / {
        auth_request /internal/board_check;
        error_page 401 = @board_need_login;
        error_page 403 = @board_need_login;
 
        proxy_pass http://dataease_upstream;
        proxy_intercept_errors on;
 
        proxy_http_version 1.1;
        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_redirect http://127.0.0.1:8100/ /;
    }
 
    location @board_need_login {
        return 302 $scheme://$http_host/board/login?next=$request_uri;
    }
}