# 反向代理示例:把 https://dsh.example.com/ 交给本机的 `dsh web`。 # # 三个要点: # 1. `Host` 必须原样透传。会话 cookie 的名字是 dsh-auth-、签名里也带 authority, # 改成别的值(例如 $proxy_host)会导致铸造出来的 cookie 永远对不上 → 一直 401。 # 同时该 authority 必须属于 DSH 的 trustedHosts(`dsh web --trusted-host dsh.example.com`)。 # 2. `location = /` 把"未认证的首页导航"在服务端内部改写成登录入口: # GET / -> 上游 401 -> 内部改写成 /__dsh_login -> 200(应用外壳)+ Set-Cookie # 浏览器地址栏全程停在 `/`。必须用 URI 形式(`error_page 401 = /__dsh_login;`): # nginx 不允许在 named location / if / 正则 location 里的 proxy_pass 带 URI 部分。 # 3. 只拦 `location = /`。静态资源、`/api`、WebSocket 升级一律走下面的 `location /` 原样透传。 # # 注意:这个配置本身不提供任何认证。转发到 DSH 的入口等于"能连上就是 operator", # 请自行确认网络边界(只允许内网/隧道/再加一层 basic auth 等)。详见插件 README。 map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream dsh_backend { server 127.0.0.1:3080; } server { listen 80; listen [::]:80; server_name dsh.example.com; return 308 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name dsh.example.com; ssl_certificate /etc/letsencrypt/live/dsh.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dsh.example.com/privkey.pem; # 首页导航:未认证时在服务端内部改写成登录入口(浏览器看不到这次改写) location = / { proxy_pass http://dsh_backend; 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 Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_intercept_errors on; # 不打开的话 error_page 看不到上游的 401 error_page 401 = /__dsh_login; # 只对这一个路径生效 } # 其余一切原样透传:前端静态资源、/api、WebSocket 升级 location / { proxy_pass http://dsh_backend; 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 Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } # 子路径挂载(例如 https://example.com/tools/dsh/)时另行注意: # · 代理侧剥掉前缀:proxy_pass http://dsh_backend/; (结尾的斜杠) # · 不要改写 Location:入口与 DSH 自己的 index 认证都返回相对地址 location: ./, # 浏览器会自己落到挂载根 # · error_page 的目标写挂载路径:error_page 401 = /tools/dsh/__dsh_login;