Laravel部署至子文件夹时Sanctum Cookie会话认证异常排查
背景
我的应用是单体仓库结构,包含server(Laravel 11后端API)、client(Vue 3单页应用)等文件夹。在Docker容器中部署正常,但放到共享主机后出现异常:登录/登出请求能正常返回预期响应,但后续请求无法被识别为已认证状态(比如Auth::check()返回false),怀疑是Cookie未正确设置或识别。
已经排查的常见问题:
- 服务器的
SESSION_DOMAIN、SANCTUM_STATEFUL_DOMAINS配置正确 - Laravel部署在
public_html/server子文件夹,根目录.htaccess配置如下:RewriteEngine On SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 RewriteCond %{REQUEST_URI} ^/api/ [OR] RewriteCond %{REQUEST_URI} ^/storage/ RewriteRule ^ server/public/$1 [L] RewriteCond %{DOCUMENT_ROOT}/server/public%{REQUEST_URI} -f RewriteRule ^(.*)$ server/public/$1 [L] RewriteRule ^ server/public/index.php [L] server/public保留了标准Laravel.htaccess文件:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
是否是其中一个.htaccess文件干扰了Sanctum的Cookie签发/识别?
解答
Laravel Sanctum 使用 Cookie 会话完全不需要部署在根目录,你的问题大概率是.htaccess转发规则或Laravel Cookie路径配置导致的Cookie无法被正确携带。
核心问题分析
登录请求成功但后续请求未认证,说明登录时服务器返回的Set-Cookie头可能存在路径错误,或者请求转发过程中丢失了Cookie相关标识,导致Laravel无法识别会话。
具体修复步骤
修正Laravel配置
- 确保
APP_URL设置为包含子目录的完整URL,例如:https://yourdomain.com/server - 检查
config/session.php中的path配置:如果前端部署在根目录,将path设置为'/'(让整个域名下的请求都携带Cookie);如果前端也在子目录,则设置为对应子路径(比如'/server/') - 确认
SESSION_DOMAIN仅设置为主域名(如yourdomain.com),不要包含子目录
- 确保
调整根目录
.htaccess规则
原规则中第一个RewriteRule的捕获逻辑可能存在问题,建议修改为更精确的匹配,避免URI转发错误:RewriteEngine On SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 # 转发API和Storage路径到Laravel public目录 RewriteCond %{REQUEST_URI} ^/(api|storage)/ RewriteRule ^(.*)$ server/public/$1 [L] # 处理静态文件请求 RewriteCond %{DOCUMENT_ROOT}/server/public%{REQUEST_URI} -f RewriteRule ^(.*)$ server/public/$1 [L] # 所有其他请求转发到Laravel入口文件 RewriteRule ^(.*)$ server/public/index.php [L]验证Cookie设置
登录后在浏览器开发者工具的「Application」→「Cookies」中查看:- Cookie的
Domain是否为你的主域名 - Cookie的
Path是否为/(或对应子目录) - Cookie的
HttpOnly、Secure(如果是HTTPS)属性是否正确设置
- Cookie的
总结
你的.htaccess规则确实可能干扰了Cookie的识别,通过调整转发规则和Laravel的Cookie路径配置,即可解决子目录部署下的Sanctum会话认证问题,无需将Laravel部署到根目录。
内容的提问来源于stack exchange,提问作者dotNET
相关产品推荐
相关产品推荐

