Apache通过mod_proxy为SSO提供网络层支撑,统一域名消除跨域限制,确保Cookie、票据等身份上下文透传;真正认证由CAS/OAuth2等中心完成,Apache仅作“通道守门人”。
apache 用 mod_proxy 实现多系统单点登录(sso),本质不是靠 mod_proxy 自身完成认证,而是为 sso 架构提供网络层支撑:把多个后端应用统一暴露在同一个域名下,消除跨域限制,确保 cookie、票据、重定向路径等身份上下文能正确透传。真正做认证的是 cas、oauth2 server 或自建 sso 中心,而 apache 是它们的“通道守门人”。
下面分三块讲清楚关键配置逻辑和避坑要点:
一、启用并加载 proxy 相关模块
必须确保以下模块已启用(通常在 httpd.conf 或 mods-enabled/ 下):
mod_proxy-
mod_proxy_http(处理 HTTP/HTTPS 后端) -
mod_proxy_balancer(如需负载均衡多个 SSO 节点) -
mod_headers(用于改写请求头,比如注入X-Forwarded-*) -
mod_rewrite(可选,用于重写跳转 URL)
检查是否启用:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule headers_module modules/mod_headers.so
Ubuntu 系统常用命令启用:
a2enmod proxy proxy_http headers rewrite systemctl restart apache2
二、反向代理配置要满足 SSO 的三个关键要求
以部署了 CAS Server 的 sso.example.com 和两个业务系统 app1.example.com、app2.example.com 为例,全部走 Apache 统一入口:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# 把 /cas 路径代理到 CAS 后端(如 Tomcat)
ProxyPass /cas https://192.168.10.20:8443/cas
ProxyPassReverse /cas https://192.168.10.20:8443/cas
# 把 /app1 代理到第一个业务系统
ProxyPass /app1 http://192.168.10.30:8080/
ProxyPassReverse /app1 http://192.168.10.30:8080/
# 把 /app2 代理到第二个业务系统
ProxyPass /app2 http://192.168.10.31:8080/
ProxyPassReverse /app2 http://192.168.10.31:8080/
# 关键:保留原始 Host,并补全转发头
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</VirtualHost>重点说明:
-
ProxyPreserveHost On:让后端看到的是example.com,不是内网 IP,否则 CAS 生成的 service URL 会出错; -
X-Forwarded-*头必须设置:后端 Java 或 PHP 应用依赖这些头判断协议、端口、真实客户端 IP,否则登录跳转可能变成http://或丢端口(如你遇到的:8080消失问题); -
ProxyPassReverse不可省:它重写后端返回的Location、Set-Cookie等响应头中的 URL,避免暴露内网地址或路径错乱。
三、配合后端做 SSO 集成的关键调整
光有代理不够,业务系统和 CAS 必须协同:
-
CAS Server 配置
在cas.properties中设:server.name=https://example.com cas.tgc.secure=true cas.service.redirect=false # 避免重定向时丢失路径前缀
-
业务系统(如 Spring Boot)
- 设置
server.forward-headers-strategy=framework(Spring Boot 2.2+); - 或手动配置
RemoteIpValve(Tomcat)识别X-Forwarded-*; - service URL 必须写成
https://example.com/app1/login/cas,不能写内网地址;
- 设置
-
Cookie 域名统一
所有系统(CAS + app1 + app2)的登录 Cookie 必须设为.example.com,才能跨子路径共享:// Java 示例:设置 Cookie Domain cookie.setDomain(".example.com"); cookie.setPath("/"); cookie.setHttpOnly(true); cookie.setSecure(true);
不复杂但容易忽略

















