You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Chrome CSP拦截Laravel登录登出重定向问题

Laravel CSP部署后登录/登出表单违规问题解决方案

问题重现

本地环境运行正常,部署到Linux服务器绑定域名后触发CSP错误:

Refused to send form data to 'https://example.com/login' because it violates the following Content Security Policy directive: "form-action 'self' https: *.example.com".

已添加对应表单地址的CSP指令但无效,仅登录/登出表单受影响,其他表单无异常。

关键代码片段

登录控制器方法

public function store(Request $request): RedirectResponse {
    $this->ensureIsNotRateLimited();
    $request->validate([
        'email' => ['required', 'string', 'lowercase', 'email', 'max:255'],
        'password' => ['required', 'string'],
    ]);

    if(! Auth::guard('admin')->attempt($request->only('email', 'password'), $request->boolean('remember'))) {
        RateLimiter::hit($this->throttleKey());
        throw ValidationException::withMessages([
            'email' => trans('auth.failed'),
        ]);
    }
    $notification = array(
        'message' => 'Anda berhasil login!',
        'alert-type' => 'success',
    );
    $request->session()->regenerate();
    RateLimiter::clear($this->throttleKey());
    return redirect()->intended(RouteServiceProvider::ADMIN_DASHBOARD)->with($notification);
}

登出控制器方法

public function destroy(Request $request): RedirectResponse {
    Auth::guard('admin')->logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
    return redirect('/admin/login');
}

无效的CSP指令配置

->addDirective(Directive::FORM_ACTION, 'https://example.com/login')
->addDirective(Directive::FORM_ACTION, 'https://example.com/logout');

解决方案

1. 修复CSP指令的添加方式

Laravel的addDirective多次调用同一指令时,后续配置会覆盖之前的规则。需将多个目标地址合并为数组传入:

->addDirective(Directive::FORM_ACTION, [
    "'self'",
    "https:",
    "*.example.com",
    "example.com", // 补充根域名,解决*.example.com不匹配主域名的问题
    "https://example.com/login",
    "https://example.com/logout"
])

注:*.example.com仅匹配子域名(如www.example.com),无法覆盖根域名example.com,必须单独添加。

2. 验证APP_URL配置

确保.env文件中的APP_URL与实际访问的域名完全一致:

APP_URL=https://example.com

'self'指令会基于APP_URL生成匹配规则,若域名不一致会导致'self'无法匹配实际请求地址。

3. 检查表单提交目标地址

确认登录/登出表单的action属性使用Laravel路由生成(而非硬编码绝对路径),避免地址不匹配:

  • 登录表单:action="{{ route('admin.login.store') }}"
  • 登出表单:action="{{ route('admin.logout') }}"

4. 开启CSP报告定位细节

添加CSP报告指令,获取更详细的违规信息辅助排查:

->addDirective(Directive::REPORT_URI, '/csp-report')

然后在路由中添加报告接收路由:

Route::post('/csp-report', function (Request $request) {
    Log::info('CSP Violation:', $request->all());
    return response()->noContent();
});

查看日志即可获取实际违规的来源地址、目标地址等关键信息。

内容的提问来源于stack exchange,提问作者Dea Fitriyani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:43:20