【问题标题】:Laravel - CSRF token not working with ajax call resulting in 500 internal server errorLaravel - CSRF 令牌不适用于 ajax 调用导致 500 内部服务器错误
【发布时间】:2015-11-19 23:20:36
【问题描述】:

问题

我有一个简单的搜索字段,它是一个表单。提交时,以下代码负责获取结果。该代码给了我一个内部服务器错误。这导致我无法在控制器中输入我的 PHP 搜索功能。我认为这与我的令牌设置有关。尽管由其他人编码,但它们与其他 ajax 调用一起使用。

注意:此代码用于在我的控制台中打印搜索查询结果。由于更改(通过在主刀片中实现令牌脚本),它停止了这样做。所以我的工作流程停留在发布 ajax 调用上。您能找到导致此错误再次出现或根本出现的原因吗?提前致谢。

代码

脚本

$("#searchonfrontpage").submit(function(e){
e.preventDefault();

var whattosearch = $("#searchFRONT").val();
console.log("searching... " + whattosearch + ".");

  $.ajax({
    type: "POST",
    url: "/", 
    data: { whattosearch: whattosearch }, 
    success : function(data){
        console.log(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus, errorThrown);
    }
  });
});

路线

//just in case
Route::filter('csrf', function() {
    $token = Request::ajax() ? Request::header('X-CSRF-Token') :     Input::get('_token');
 if (Session::token() != $token)
    throw new Illuminate\Session\TokenMismatchException;
});

//frontpage routes
Route::get('/','frontpageController@frontpage');
Route::post('/', 'frontpageController@search');

主刀片中的令牌脚本(与其他 ajax 调用一起使用)

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

搜索功能

public function search() {

    //not making it here because of the 500 server error with post
    print_r("call made");

    $q = $_POST["whattosearch"];
    print_r($q);

    $searchTerms = explode(' ', $q);
    $query = DB::table('projects');

    foreach($searchTerms as $term){
        $query->join('users', 'users.id', '=', 'projects.user_id')
              ->where('title', 'LIKE', '%'. $term .'%')
              ->orWhere('tags', 'LIKE', '%'. $term .'%')
              ->orWhere('body', 'LIKE', '%'. $term .'%')
              ->orWhere('username', 'LIKE', '%'. $term .'%')
              ->orderBy('created_at', 'desc');
    }

    $projects = $query->get();

    print_r($projects); //used to be able to see these results, but not anymore

    //return data view here (also gives a 500 error when I used to be able to get projects)

    //return View::make( 'viewfile' )->with( 'data', $projects );
    //return View::make('projects', compact('projects'));
}

【问题讨论】:

  • 你检查过 Laravel 日志和/或 HTPP 服务器日志看看有什么错误吗?
  • 感谢您写出清晰的问题!几件事要尝试:1)尝试将X-CSRF-Token更改为X-CSRF-TOKEN,因为它是区分大小写的(我不记得了)。 2)尝试将您的令牌作为_token 在作为AJAX 调用中的数据传递的对象中传递。 3) 确保 AJAX 预过滤器用 $(document).ready(function() { ... }); 包裹,以便在元素可用后设置令牌。
  • 能否请您在search() 方法中注释foreach 循环代码,然后调用Ajax。我希望你能得到一些新的输出。
  • 感谢您的评论!杰伊:因为我的调用不会进入函数,所以我没有得到输出。杰里米:我试过你的方法。似乎没有为我解决它,对不起。我对如何做第二个有点困惑。我已经能够将令牌转换为字符串,我可以将它添加到我的数据属性中。不知道用它做什么。 Bogdan:还没有检查服务器本身,会的!
  • 我重新开始学习本教程:link。代码没有太大变化,因此不会影响以下内容:教程允许我执行 ajax 请求,但我的代码在 $projects = $query->get();现在,导致调用不成功。我收到的新错误是Uncaught SyntaxError: Unexpected token <,同时再次收到 500 错误。此错误链接到我的文件 VM14763。好像在该文档中打印了某些内容。我在 之前看到一个 (。但没有打印/转储任何东西。

标签: php ajax laravel


【解决方案1】:

按照此 [教程] (https://www.youtube.com/watch?v=eoGITOPpBfU) 获得了结果。不确定最初的问题是什么。

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2016-10-13
    • 2017-04-10
    • 2013-08-11
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多