如何移除Laravel默认Strict-Transport-Security并自定义配置?
解决Laravel+Inertia项目HSTS头重复及生产环境419错误问题
一、消除重复的Strict-Transport-Security头
当前出现两个HSTS头是因为Laravel默认配置和.htaccess设置同时生效,可通过以下两种方式解决:
方式1:通过.htaccess覆盖原有头
修改.htaccess中的<IfModule mod_headers.c>块,先移除原有HSTS头再设置新值,确保仅保留一个有效头:
<IfModule mod_headers.c> # 先移除Laravel默认添加的HSTS头 Header unset Strict-Transport-Security # 设置12个月有效期的HSTS规则 Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS </IfModule>
方式2:禁用Laravel自带的HSTS头
若不想通过.htaccess管理HSTS,可直接关闭Laravel的默认HSTS配置:
- 打开
app/Http/Kernel.php,找到全局中间件或web中间件组中的\Illuminate\Http\Middleware\AddHttpHeaders::class(部分Laravel版本为\Illuminate\Http\Middleware\SendHeaders::class),将其注释或移除。 - 也可通过自定义中间件完全接管HSTS头(见下文)。
二、修复生产环境419错误
419错误通常与CSRF验证、会话配置相关,结合HSTS场景,按以下步骤排查修复:
配置HTTPS相关参数
- 在
.env文件中设置:APP_URL=https://你的域名、SESSION_SECURE_COOKIE=true - 编辑
config/session.php,设置:'secure' => env('SESSION_SECURE_COOKIE', true)、'domain' => env('SESSION_DOMAIN', '你的域名')
- 在
清除配置缓存
通过共享主机的SSH工具或控制面板终端执行:php artisan config:cache php artisan cache:clear php artisan view:clear确保CSRF令牌正常传递
- Inertia项目根模板(如
resources/views/app.blade.php)需包含@csrf指令 - 前端发起请求时,确认Inertia自动携带
X-CSRF-TOKEN头(手动请求需自行添加)
- Inertia项目根模板(如
三、自定义中间件实现HSTS(替代.htaccess方案)
若之前自定义中间件未生效,检查以下配置要点:
创建中间件文件
app/Http/Middleware/CustomHsts.php:<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class CustomHsts { public function handle(Request $request, Closure $next) { $response = $next($request); // 仅在生产环境且HTTPS请求时设置HSTS if (app()->environment('production') && $request->isSecure()) { // 第三个参数设为true,强制覆盖已有的HSTS头 $response->headers->set( 'Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload', true ); } return $response; } }在
app/Http/Kernel.php的$middlewareGroups['web']中注册该中间件,放在所有响应头相关中间件之后,确保能覆盖默认值:protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\CustomHsts::class, ], ];执行缓存清除命令,确保中间件生效。
内容的提问来源于stack exchange,提问作者ASHafizullah
相关产品推荐
相关产品推荐

