部署的 Laravel 应用无法处理通过 Ajax 传递给控制器​​的变量

Deployed Laravel app can't handle variables passed to controller via Ajax

我在我的本地环境中创建了一个 Laravel 应用程序,它工作得很好。当我将它部署到 VPS 服务器时,为了在线访问它,由于某种原因,我的 AJAX 停止工作 .这是一个非常简单的 AJAX 函数示例,它在本地工作,但 在我的服务器中不工作。

观点:

<html>
<head>
    <title>Ajax Example</title>
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
    </script>

    <script>
        function getMessage() {
            $.ajax({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                type: 'GET',
                url: '/getmsg',
                data: {
                    greeting: 'Hello'
                },
                success: function (data) {
                    $("#msg").html(data.msg);
                }
            });
        }
    </script>
</head>

<body>
<div id='msg'>This message will be replaced using Ajax.
    Click the button to replace the message.
</div>
<?php
echo Form::button('Replace Message', ['onClick' => 'getMessage()']);
?>
</body>

</html>

控制器:

class TestAjaxController extends Controller {
    public function index(Request $request) {
        return response()->json(array('msg'=> $request->greeting), 200);
    }
}

路线:

//Test routes
Route::get('ajax-test',function() {
    return view('ajax-test');
});
Route::get('/getmsg','TestAjaxController@index');

所有这个功能所做的,是通过点击一个按钮,它向控制器发送一个定义的变量,然后控制器 returns 向视图发送一个带有相同消息的响应,然后 Jquery 改变消息的文本。

问题是按下按钮时没有数据被传递给控制器​​,所以控制器returns空数组.

注意:我的本地环境使用 Apache (XAMPP),但我的 VPS 使用 NGINX。虽然我怀疑这是这里的问题。

我完全不知道哪里出了问题。也许我的 VPS 安装或类似的东西中缺少一些 PHP 模块?

您实际上是在访问表单域。直接来自文档

Retrieving Input Via Dynamic Properties

您还可以使用 Illuminate\Http\Request 实例上的动态属性访问用户输入。例如,如果您的应用程序的一个表单包含一个 name 字段,您可以像这样访问该字段的值:

$name = $request->name;

使用动态属性时,Laravel 将首先在请求负载中查找参数值。如果不存在,Laravel 将在路由参数中搜索该字段。

所以尝试使用 $request->query('name') 例如 TestAjaxController 应该是

class TestAjaxController extends Controller {
    public function index(Request $request) {
        return response()->json(array('msg'=> $request->query('greeting')), 200);
    }
}

我没有测试,但应该可以。希望这会对你有所帮助:)

所以出于某种原因我只需要使用 POST 方法。我不知道为什么一切都在本地使用 GET,但在生产服务器上我不得不使用 POST

这是工作代码: 查看:

<script>
    function getMessage() {
        $.ajax({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            type: 'POST',
            url: '/getmsg',
            data: {
                greeting: 'Hello'
            },
            success: function (data) {
                $("#msg").html(data.msg);
            }
        });
    }
</script>

路线:

Route::get('ajax-test',function() {
    return view('ajax-test');
});
Route::post('/getmsg','TestAjaxController@index');