nginx多站点共用80端口时cookie冲突,是因为phpenv默认所有站点server_name均为localhost且未设domain属性,浏览器将set-cookie视为domain=localhost统一存储;而localhost不支持二级域隔离,导致不同站点cookie混用。

phpEnv 中 Nginx 多站点共用 80 端口时 Cookie 为什么会冲突
因为 phpEnv 默认为所有站点启用 server_name localhost,且未显式设置 Domain 属性,浏览器会把 Set-Cookie: sid=abc 当作 Domain=localhost 存储——而所有本地站点都走 localhost,Cookie 就被混在一起读写了。
这不是 phpEnv 的 bug,而是浏览器对 localhost 的特殊处理:它不支持二级域隔离(比如 site1.localhost 和 site2.localhost 仍共享同一 Cookie 上下文),除非你用真实域名或带端口的地址。
- 现象:登录 siteA 后访问 siteB,后端收到的
Cookie头里混着 siteA 的sid,导致鉴权失败或 session 覆盖 - 关键点:
localhost不是“可分级域”,Domain=.localhost是非法值,浏览器直接忽略 - phpEnv 的
nginx.conf里默认没开proxy_cookie_domain或proxy_cookie_path,无法重写响应头中的 Cookie 域名/路径
改用自定义域名 + hosts 绑定是最稳的解法
绕过 localhost 的限制,让每个站点有独立、合法的根域,浏览器才能按 Domain 隔离 Cookie。
- 编辑系统
C:\Windows\System32\drivers\etc\hosts(Windows)或/etc/hosts(macOS/Linux),添加: 127.0.0.1 sitea.test127.0.0.1 siteb.test- 在 phpEnv 的站点配置中,把每个站点的
server_name改成对应域名,例如:server_name sitea.test; - 确保 PHP 的
session.cookie_domain设置匹配,比如在php.ini或站点.user.ini中加:session.cookie_domain = ".sitea.test" - 重启 phpEnv 的 Nginx 和 PHP 服务(不是仅 reload)
如果必须用 localhost,就靠 Nginx 重写 Cookie 路径
当无法改 hosts 或需快速验证时,可用 proxy_cookie_path 强制区分路径级上下文,但仅适用于反向代理模式(即前端静态资源也走 Nginx,后端 API 单独部署)。
- 在对应站点的
server块内添加:proxy_cookie_path / /sitea/;—— 这会让后端返回的Set-Cookie: sid=abc; Path=/变成Path=/sitea/ - 前端请求时,必须把所有 API 调用路径加前缀,如
/sitea/api/login,否则浏览器不会发送该 Cookie - 注意:
proxy_cookie_path不影响原始 Cookie 的 Domain,所以仍要配合withCredentials: true和 CORS 头,且不能用于纯静态 HTML 直接加载 PHP 的场景 - 若站点是 PHP-FPM 直出(非 proxy),则此配置无效;应改用
fastcgi_param HTTP_COOKIE在入口层过滤变量
phpEnv 的 Nginx 配置文件位置与热加载限制
phpEnv 的 Nginx 配置分散在多个地方,改错位置会导致重启无效或报错。
- 主配置在:
%phpEnv安装目录%\nginx\conf\nginx.conf,但不要直接改它——会被更新覆盖 - 站点专属配置在:
%phpEnv安装目录%\nginx\vhost\下的各.conf文件,这是唯一应修改的位置 - 改完后必须点 phpEnv 界面的「重启 Nginx」按钮,
nginx -s reload命令在 phpEnv 中不可靠,因它管理的是 Windows 服务实例 - 若遇到
nginx: [emerg] unknown directive "proxy_cookie_path",说明你用的是极老版本 Nginx(nginx.exe
真正容易被忽略的是:phpEnv 的「站点根目录」和「Nginx server_name」必须严格一致,否则 try_files $uri $uri/ /index.php?$args 会找不到路由,导致 Cookie 写入失败却无报错。建议每次改完先 curl -I http://sitea.test 检查响应头里的 Set-Cookie 是否含预期 Domain 和 Path。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











