XAMPP 本身不支持跨域名 SSO 模拟,因浏览器同源策略隔离 Cookie 和存储,多端口或多域名配置无法共享登录态;真模拟 SSO 必须统一主域名(如 a.test、b.test、sso.test),配 hosts 映射、VirtualHost、SSL 证书及显式 Set-Cookie(Domain=.test; SameSite=None; Secure),并启用 mod_ssl 和 mod_proxy。

直接说结论:XAMPP 本身不支持跨域名的 SSO(单点登录)模拟,VirtualHost 配置多端口 + 多域名只是让多个站点能被独立访问,但浏览器仍会把 www.a.com 和 www.b.com 视为完全隔离的源——Cookie、LocalStorage、SameSite 策略全不共享。真要模拟 SSO,得绕过同源限制,或改用其他机制。
为什么多端口 ≠ 多域名 SSO?
很多人以为只要配好 localhost:3000 和 localhost:3001,再分别绑 a.local 和 b.local,就能测试跨域登录态传递。但现实是:
- 浏览器对
a.local写的 Cookie,b.local根本读不到,Domain属性无法跨二级域名设成.local(.local是保留 TLD,Chrome/Firefox 拒绝写入) -
localhost:3000和localhost:3001虽然 IP 相同,但端口不同 → 仍是不同源 →document.cookie不互通 - 现代浏览器默认启用
SameSite=Lax,即使你手动设Domain=localhost,带端口的请求也会被拦截
想本地模拟 SSO,必须统一主域名
可行路径只有一条:所有服务共用同一个一级域名(如 a.test、b.test、sso.test),靠子域名 + 共享 Cookie 实现登录态透传。操作要点:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 在
C:\Windows\System32\drivers\etc\hosts中统一映射:127.0.0.1 a.test127.0.0.1 b.test127.0.0.1 sso.test - 每个
<VirtualHost *:80>的ServerName必须严格匹配 hosts 里写的域名,不能混用localhost或 IP - SSO 服务(如 PHP 写的登录中心)响应 Set-Cookie 时,必须显式指定:
Set-Cookie: auth_token=xxx; Domain=.test; Path=/; HttpOnly; Secure; SameSite=None -
Secure标志要求 HTTPS —— 本地开发需用 XAMPP 自带的 OpenSSL 配 SSL 证书,否则浏览器拒绝接受SameSite=None
多端口配置反而破坏 SSO 模拟条件
如果你硬要在 httpd.conf 里加 Listen 8080,又在 httpd-vhosts.conf 里写 <VirtualHost *:8080>,会出现这些实际问题:
- 浏览器地址栏显示
http://a.test:8080/→ 此时域名是a.test:8080,不是a.test→ Cookie 的Domain=.test失效 - 前端发请求到
/api/login,如果没配代理,实际发向a.test:8080/api/login,后端返回的 Cookie 域名会被浏览器自动设为a.test:8080,无法被b.test读取 - Apache 默认不监听非 80/443 端口的 HTTPS,
SameSite=None; Secure在 HTTP 端口下直接被忽略
真正可用的本地 SSO 开发方案
放弃“多端口多域名”思路,改用以下任一方式:
-
反向代理统一入口:用 Apache 的
mod_proxy把a.test/api、b.test/api、sso.test/auth全部代理到本地不同端口(如127.0.0.1:3000、127.0.0.1:4000),对外只暴露:80,保持同源 -
用
.localhost替代.test:RFC 6761 明确规定.localhost只能解析为127.0.0.1,且现代浏览器允许设置Domain=localhost(注意不是.localhost),可跨子域共享 Cookie -
跳过 Cookie,用 JWT + localStorage + postMessage:登录页(
auth.localhost)登录后,把 token 通过window.postMessage发给父页(a.localhost),由父页存入localStorage并自行管理有效期 —— 完全绕开同源限制
最常被忽略的一点:XAMPP 的 Apache 默认禁用 mod_ssl 和 mod_proxy,启用前必须先在 httpd.conf 里取消对应 LoadModule 行的注释,否则代理或 HTTPS 都跑不起来。

















