本地正常的Laravel+OpenAI项目部署hPanel后POST请求报404错误
Laravel部署hPanel子域名后/api/send返回404的排查方案
1. 确认子域名文档根目录指向public文件夹
hPanel中子域名默认可能指向对应子域名的根文件夹,但Laravel的入口文件是public/index.php,必须将子域名的文档根目录设置为项目的public目录,否则路由无法被正确解析,直接返回404。
2. 检查前端API请求路径是否正确
你的JS代码中使用了Blade语法{{ url('/api/send') }}生成请求地址:
const url = '{{ url('/api/send') }}';
- 如果这段JS代码是放在单独的.js文件中,Blade语法不会被解析,最终
url变量会是字符串{{ url('/api/send') }},导致请求路径错误。 - 解决方法:
- 要么将JS代码嵌入到Blade模板的
<script>标签内; - 要么在Blade模板中定义全局变量,再在单独JS文件中引用:
<!-- Blade模板头部添加 --> <script>window.apiSendUrl = '{{ url('/api/send') }}';</script>// JS文件中使用 const url = window.apiSendUrl;
- 要么将JS代码嵌入到Blade模板的
3. 重置线上路由缓存
部署后可能存在路由缓存问题,导致新路由未加载:
- 通过hPanel的终端或SSH连接服务器,执行命令:
php artisan route:clear php artisan route:cache # 生产环境建议缓存路由提升性能 - 执行
php artisan route:list查看路由列表,确认POST /api/send是否存在。
4. 验证URL重写规则
Laravel依赖.htaccess实现URL重写,确认public目录下的.htaccess文件存在且配置正确:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
同时在hPanel的设置中确认mod_rewrite模块已启用。
5. 检查控制器文件与命名空间
- 确认
ChatBotController.php文件存在于app/Http/Controllers目录下,线上环境文件名大小写正确(Linux系统区分大小写,本地Windows不区分); - 控制器类的命名空间必须是
namespace App\Http\Controllers;,与路由中的引用一致。
额外注意:控制器代码的语法错误
你的控制器中使用了中文引号,且参数名错误:
// 错误写法 ‘max-token’ => 150, ‘model’ => ‘text-davinci-003’,
需改成英文单引号,且参数名应为max_tokens(OpenAI API要求的正确参数名):
// 正确写法 'max_tokens' => 150, 'model' => 'text-davinci-003',
这个错误会导致PHP语法报错,虽不会直接引发404,但会导致请求失败,需一并修复。
内容的提问来源于stack exchange,提问作者vLk171x
相关产品推荐
相关产品推荐

