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的重定向规则上,但调了几次都没搞定,想请教大家:
- 为啥会触发内部重定向次数超限?该怎么修复?
- CORS错误是不是500错误带出来的连锁问题?修复500后CORS会自己好吗?
- 针对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/storage和backend/bootstrap/cache目录设755权限(LWS主机对权限要求严,这个权限既能保证Laravel读写,又不会触发安全限制) - 生产环境建议把
APP_DEBUG设为false,避免泄露敏感信息;同时在本地执行缓存命令后上传缓存文件:
把php artisan config:cache php artisan route:cachebootstrap/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的文件同步到主机,别直接传未缓存的配置文件




