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

Laravel中AJAX请求自定义PHP文件出现404错误的解决咨询

问题描述

我在home.blade.php中编写了AJAX请求代码来获取消息,代码如下:

function getMessages(){ 
    $.post("public/ajax_handlers/get_messages.php", { 
        user_id: "<?php echo \Session::get('user_id'); ?>", 
    }, function(data, status){ 
        alert("Data: " + data + "\nStatus: " + status); 
    }); 
}

我将处理请求的PHP文件放置在/public/ajax_handlers/目录下,但加载页面时出现404错误:

POST http://localhost:8000/public/ajax_handlers/get_messages.php 404 (Not Found)
XHR failed loading: POST "http://localhost:8000/public/ajax_handlers/get_messages.php".

搜索相关信息后了解到可使用Laravel的use功能或Storage类,但并未理解具体用法,请问如何让该请求正常运行?

解决方法

兄弟,你这是踩了Laravel开发的常见小坑啦——Laravel不推荐直接在public目录下放自定义PHP文件处理请求,因为它有一套完整的路由-控制器机制来处理HTTP请求,直接访问public里的PHP文件会因为框架的路由规则找不到对应路径,所以才会报404。你查到的use和Storage其实和这个场景不沾边:use是PHP的命名空间引用关键字,Storage是Laravel处理文件存储的类,都不是用来处理AJAX请求的。

咱直接按Laravel的规范来操作,步骤很清晰:

1. 创建处理AJAX请求的控制器

先在终端运行Artisan命令创建一个控制器,比如AjaxController:

php artisan make:controller AjaxController

打开生成的app/Http/Controllers/AjaxController.php,添加处理获取消息的方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class AjaxController extends Controller
{
    public function getMessages(Request $request)
    {
        // 用Laravel的Session门面获取用户ID,比原生写法更规范
        $userId = Session::get('user_id');
        
        // 这里写你的业务逻辑,比如从数据库查询用户的消息
        // 示例:$messages = \App\Models\Message::where('user_id', $userId)->get();
        
        // 返回JSON格式的响应,前端AJAX可以直接解析
        return response()->json([
            'status' => 'success',
            'user_id' => $userId,
            // 'messages' => $messages // 后续可以把查询到的消息返回
        ]);
    }
}

2. 配置路由

打开routes/web.php(因为是从Blade页面发起的请求,用web路由更合适,能自动带上Session和CSRF保护),添加一条POST路由:

use App\Http\Controllers\AjaxController;

// 定义路由,给个名字方便后续生成URL
Route::post('/ajax/get-messages', [AjaxController::class, 'getMessages'])->name('ajax.get-messages');

3. 修改AJAX请求代码

回到home.blade.php里的AJAX代码,把请求地址改成我们刚定义的路由(用Laravel的route()函数生成URL,避免硬编码路径出错),同时必须带上CSRF令牌——Laravel默认会验证POST请求的CSRF令牌,不带的话会返回419错误:

function getMessages(){ 
    $.post("{{ route('ajax.get-messages') }}", { 
        _token: "{{ csrf_token() }}", // 一定要加这个CSRF令牌
        user_id: "{{ \Session::get('user_id') }}", 
    }, function(data, status){ 
        // 因为返回的是JSON,用JSON.stringify格式化后再弹窗展示
        alert("Data: " + JSON.stringify(data) + "\nStatus: " + status); 
    }); 
}

这样操作后,你的AJAX请求就能正常触发控制器里的逻辑,再也不会报404啦~

内容的提问来源于stack exchange,提问作者user9724533

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:36