You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel12后端+Vue前端在共享主机(LWS)开发环境正常但生产环境出现500错误及CORS问题求助

Laravel12后端+Vue前端在共享主机(LWS)开发环境正常但生产环境出现500错误及CORS问题求助

问题背景

我最近在LWS共享主机上部署前后端分离应用:前端Vue.js放在主域名denentzat.fr,后端Laravel 12放在子域名backend.denentzat.fr。本地开发一切顺畅,但到生产环境就卡壳了——前端请求/sanctum/csrf-cookie接口返回500错误,还弹“CORS Missing Allow Origin”;直接访问后端加的测试路由/test也返回500内部服务器错误,服务器日志说内部重定向次数超限了。

主机目录结构

htdocs/
|-- assets(dir) // 前端资源文件夹
|-- index.html // 前端入口文件
|-- backend(dir) // Laravel核心代码目录
|   |-- app(dir)
|   |-- bootstrap(dir)
|   |-- config(dir)
|   |   |-- sanctum.php
|   |   |-- cors.php
|   |   |-- ...
|   |-- database(dir)
|   |-- public(dir)
|   |-- resources(dir)
|   |-- routes(dir)
|   |   |-- api.php
|   |   |-- auth.php
|   |   |-- web.php
|   |-- storage(dir)
|   |-- test(dir)
|   |-- vendor(dir)
|-- backend.denentzat.fr(dir) // 子域名的文档根目录
|   |-- index.php
|   |-- .htaccess

关键文件内容

子域名文档根目录下的index.php

<?php

use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// 检测应用是否处于维护模式
if (file_exists($maintenance = __DIR__.'/../backend/storage/framework/maintenance.php')) {
    require $maintenance;
}

// 注册Composer自动加载器
require __DIR__.'/../backend/vendor/autoload.php';

// 启动Laravel并处理请求
(require_once __DIR__.'/../backend/bootstrap/app.php')
    ->handleRequest(Request::capture());

子域名文档根目录下的.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # 处理Authorization请求头
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 处理X-XSRF-Token请求头
    RewriteCond %{HTTP:x-xsrf-token} .
    RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]

    # 移除URL末尾的斜杠(如果不是目录)
    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>

后端.env关键配置片段

APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:O4uiM3LM6/ryGhkGYSz9fdeRPznPIHGcJzSTvMeuBUM=
APP_DEBUG=true
APP_URL=https://backend.denentzat.fr
FRONTEND_URL=https://denentzat.fr
REGISTER_CODE=Amendeuix
SANCTUM_STATEFUL_DOMAINS=denentzat.fr
...
SESSION_DOMAIN=.denentzat.fr
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax

后端config/cors.php配置

<?php

return [
    'paths' => ['*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => [env('FRONTEND_URL', 'http://localhost:9000')],
    'allowed_origins_patterns' => ['*'],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,
];

服务器错误日志片段

Date : 05/11/2025 09:53:14
IP : 83.193.34.84:0
Requête : GET /test HTTP/2.0
Code HTTP : 500
Referer : Aucun
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0
Erreur : AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Date : 05/11/2025 09:52:31
IP : 83.193.34.84:0
Requête : GET /sanctum/csrf-cookie HTTP/2.0
Code HTTP : 500
Referer : https://denentzat.fr/
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0
Erreur : AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error.

我的疑问与求助点

我猜问题可能出在index.php的路径引用或者.htaccess的重定向规则上,但调了几次都没搞定,想请教大家:

  1. 为啥会触发内部重定向次数超限?该怎么修复?
  2. CORS错误是不是500错误带出来的连锁问题?修复500后CORS会自己好吗?
  3. 针对LWS这种目录结构,Laravel部署有啥特殊要注意的地方不?

问题分析与解决方案

1. 内部重定向超限的核心原因

从日志能直接看出来,问题根源是子域名入口的index.php路径引用和.htaccess重写规则不匹配,导致服务器陷入无限重定向循环。

你当前用相对路径../backend/指向Laravel核心,但共享主机的文档根目录权限和路径解析逻辑和本地不一样,再加上.htaccess的重写规则没正确指向入口文件,结果就是每次请求都被反复重定向,直到超过10次上限返回500。

2. 具体修复步骤

步骤一:修正index.php的路径引用

优先用绝对路径(避免相对路径解析翻车),LWS主机的绝对路径一般是/home/你的用户名/htdocs/,修改backend.denentzat.fr/index.php

<?php
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// 用绝对路径指向Laravel根目录
$laravelRoot = '/home/你的用户名/htdocs/backend';

// 维护模式检测
if (file_exists($maintenance = $laravelRoot.'/storage/framework/maintenance.php')) {
    require $maintenance;
}

// 加载Composer自动加载器
require $laravelRoot.'/vendor/autoload.php';

// 启动Laravel处理请求
(require_once $laravelRoot.'/bootstrap/app.php')
    ->handleRequest(Request::capture());

如果不确定自己的绝对路径,可在index.php里加一行echo __DIR__;访问子域名,就能看到当前目录的绝对路径,再推导Laravel核心的路径。

步骤二:修复.htaccess的重写规则

当前的重写规则没明确指定入口文件的转发逻辑,导致循环重定向,修改为:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # 处理Authorization请求头
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 处理X-XSRF-Token请求头
    RewriteCond %{HTTP:x-xsrf-token} .
    RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]

    # 移除末尾斜杠
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # 关键:明确把请求转发到当前目录的index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

重点是最后一行RewriteRule ^(.*)$ index.php/$1 [L],确保所有非文件/目录的请求都正确转发到入口文件,不会触发循环。

步骤三:Laravel权限与缓存处理

  • backend/storagebackend/bootstrap/cache目录设755权限(LWS主机对权限要求严,这个权限既能保证Laravel读写,又不会触发安全限制)
  • 生产环境建议把APP_DEBUG设为false,避免泄露敏感信息;同时在本地执行缓存命令后上传缓存文件:
    php artisan config:cache
    php artisan route:cache
    
    bootstrap/cache目录下的缓存文件同步到主机对应位置,提升性能同时避免配置解析错误。

3. CORS问题的处理

没错,CORS错误就是500错误的连锁反应:后端返回500时,根本没机会输出config/cors.php里配置的CORS响应头,所以浏览器才报“CORS Missing Allow Origin”。只要500修复了,后端正常返回响应,CORS配置就会生效,这个问题会自动解决。

另外,建议把SANCTUM_STATEFUL_DOMAINS改成包含主域名和子域名:

SANCTUM_STATEFUL_DOMAINS=denentzat.fr,backend.denentzat.fr

确保Sanctum能正确识别信任的域名,避免后续认证环节出问题。

4. LWS共享主机的特殊注意事项

  • 优先用绝对路径引用文件,别依赖相对路径,LWS的路径解析逻辑和本地差异大
  • 不要直接暴露Laravel的public目录,像你现在用子域名目录做入口是对的,但一定要保证入口文件路径指向正确
  • 如果主机不支持SSH执行Artisan命令,就在本地执行缓存命令后,把bootstrap/cache的文件同步到主机,别直接传未缓存的配置文件

火山引擎 最新活动