Laravel 9+Inertia.js项目如何强制HTTPS并适配HSTS?
Laravel 9 + Inertia.js 强制HTTPS适配方案(cPanel环境)
一、适配Inertia的专属强制HTTPS中间件
Inertia对重定向的处理逻辑和原生Laravel不同,直接用原生重定向可能导致前端状态丢失,需编写适配中间件:
- 创建中间件文件
app/Http/Middleware/ForceHttpsInertia.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Inertia\Inertia; class ForceHttpsInertia { public function handle(Request $request, Closure $next) { if (app()->environment('production') && !$request->secure()) { // 针对Inertia请求,用Inertia专属方法跳转,保留前端状态 if ($request->header('X-Inertia')) { return Inertia::location(secure_url($request->getRequestUri())); } // 普通请求直接重定向到HTTPS return redirect()->secure($request->getRequestUri()); } return $next($request); } }
- 在
app/Http/Kernel.php中注册中间件,添加到web中间件组顶部:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\ForceHttpsInertia::class, \App\Http\Middleware\EncryptCookies::class, // ... 其他原有中间件 ], ];
二、cPanel环境额外配置检查
- 修正
.htaccess规则,确保覆盖HTTPS强制跳转和Laravel路由:
项目根目录的.htaccess添加以下规则(根据部署路径调整):
<IfModule mod_rewrite.c> RewriteEngine On # 强制HTTPS跳转 RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Laravel路由重写(项目部署在根目录时用) RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule>
若项目直接部署在public目录,则使用标准Laravel重写规则:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>
- 补全HSTS头(若cPanel自带HSTS配置未生效):
在.htaccess中添加:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
三、修复URL::forceScheme失效问题
cPanel多使用反向代理,Laravel无法识别真实请求协议,需配置信任代理:
在app/Providers/AppServiceProvider.php的boot方法中补充:
use Illuminate\Http\Request; public function boot() { if ($this->app->environment('production')) { // 信任代理服务器传递的协议头 Request::setTrustedProxies(['*'], Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PROTO); URL::forceScheme('https'); } }
内容的提问来源于stack exchange,提问作者ASHafizullah
相关产品推荐
相关产品推荐

