如何在Nginx中重写Location头实现子域名到子目录映射
解决方案
1. 重写重定向的Location头
Nginx的proxy_redirect指令专门用于修改后端返回的重定向Location头,完全适配你的场景。你需要在对应的location块中添加该指令,将内部地址替换为匹配的公网地址:
location ~ ^/private/auth(/?.*)$ { proxy_pass https://auth.private/$1; # 替换Keycloak返回的内部重定向地址 proxy_redirect https://auth.private/ https://my.organisation/private/auth/; proxy_redirect https://auth.tkeir/ https://my.organisation/private/auth/; }
说明:
- 第一条
proxy_redirect会把后端返回的https://auth.private/xxx格式重定向地址,替换为https://my.organisation/private/auth/xxx - 第二条针对你curl发现的
auth.tkeir地址做同样替换(这大概率是Keycloak自身配置的前端URL有误导致,建议后续调整Keycloak的frontendUrl参数为https://my.organisation/private/auth,可减少Nginx的配置工作量)
如果要简化多内部域名的规则,也可以用正则通配符:
proxy_redirect ~^https?://auth\.(private|tkeir)/ https://my.organisation/private/auth/;
2. 便捷管理所有重定向
方法1:拆分配置片段单独管理
把所有重定向规则放到独立的配置文件中(比如/etc/nginx/conf.d/keycloak-redirects.conf),再在主server块中引入,便于集中维护:
keycloak-redirects.conf:
# Keycloak重定向规则集合 proxy_redirect https://auth.private/ https://my.organisation/private/auth/; proxy_redirect https://auth.tkeir/ https://my.organisation/private/auth/;
主配置的server块:
server { listen 443 ssl; server_name my.organisation; # 其他SSL相关配置... location ~ ^/private/auth(/?.*)$ { proxy_pass https://auth.private/$1; include conf.d/keycloak-redirects.conf; # 其他proxy必要配置(如请求头)... } }
方法2:用变量统一管理地址
如果后续可能修改域名,通过变量把公网、内部地址统一管理,修改时只需调整变量值即可:
server { listen 443 ssl; server_name my.organisation; # 定义统一变量,集中管理地址 set $internal_auth_root https://auth.private/; set $public_auth_root https://my.organisation/private/auth/; set $legacy_internal_root https://auth.tkeir/; location ~ ^/private/auth(/?.*)$ { proxy_pass $internal_auth_root$1; proxy_redirect $internal_auth_root $public_auth_root; proxy_redirect $legacy_internal_root $public_auth_root; } }
额外建议:补充Proxy请求头
为了让Keycloak正确识别客户端的真实请求信息,建议在location块中添加以下头信息:
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;
内容的提问来源于stack exchange,提问作者Nelson G.
相关产品推荐
相关产品推荐

