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

Laravel 9+Inertia.js项目如何强制HTTPS并适配HSTS?

Laravel 9 + Inertia.js 强制HTTPS适配方案(cPanel环境)

一、适配Inertia的专属强制HTTPS中间件

Inertia对重定向的处理逻辑和原生Laravel不同,直接用原生重定向可能导致前端状态丢失,需编写适配中间件:

  1. 创建中间件文件 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);
    }
}
  1. 在app/Http/Kernel.php中注册中间件,添加到web中间件组顶部:
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\ForceHttpsInertia::class,
        \App\Http\Middleware\EncryptCookies::class,
        // ... 其他原有中间件
    ],
];

二、cPanel环境额外配置检查

  1. 修正.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>
  1. 补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:19