在我的项目中,我将Laravel纯粹用作后端api,所有前端都由Angular javascript处理.目前,可以直接访问Laravel路由,它将以Json格式输出浏览器中显示的所有数据.我想对它加以限制,这样Laravel只响应Ajax请求,而不响应其他请求.

我读了这篇here篇文章,其中有一个解决Laravel 4的方法,就是在filter.php中增加一个限制.但是从Laravel 5.1开始,过滤器就不再使用了,我相信中间件也可以用来做同样的事情.然而,我不知道如何将Laravel 4解决方案从过滤器改为中间件.

Can someone share your ideas on how to prevent Laravel 5.1 routes from being accessed directly please?

Laravel 4溶液使用filter.php:

Route::filter('isAJAX', function()
{
    if (!Request::AJAX()) return Redirect::to('/')->with(array('route' => Request::path()));
});

然后把你只想通过AJAX访问的所有路由放到一个组中.在你的路由上.php:

Route::group(array('before' => 'isAJAX'), function()
{
    Route::get('contacts/{name}', ContactController@index); // Or however you declared your route

    ... // More routes
});

推荐答案

使用以下内容创建中间件文件app/Http/Middleware/OnlyAjax.php:

<?php 

namespace App\Http\Middleware;

class OnlyAjax
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, \Closure $next)
    {
        if ( ! $request->ajax())
            return response('Forbidden.', 403);

        return $next($request);
    }
}

然后在文件app/Http/Kernel.php中注册中间件

<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        //... your original code
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        //... your original code
        'ajax' => \App\Http\Middleware\OnlyAjax::class,
    ];
}

最后,将中间件连接到任何只想通过AJAX访问的路由或路由组.即:

/// File: routes/web.php

// Single route
Route::any('foo', 'FooController@doSomething')->middleware('ajax');

// Route group
Route::middleware(['ajax'])->group(function () {
    // ...
});

Laravel相关问答推荐

如何在Vite和Rollup中完全禁用分块?

Laravel Eloquent:组合列(或自定义属性)上的 Where 子句

如何在 Laravel 中使用内存数据库的完整测试套件之前迁移和 seeder ?

Laravel 4:如何将 WHERE 条件应用于 Eloquent 类的所有查询?

Laravel 的 APP_ENV 变量(在 .env 文件中找到)是否有建议的值列表?

laravel:如何在 Eloquent Query 中使用 LOWERCASE 函数?

Laravel 5.x 中 onUpdate / onDelete 的可用操作

为什么人们将 .env 放入 gitignore?

Laravel - 超过 PHP 最大上传大小限制时验证文件大小

Laravel 扩展验证自定义消息

localhost 和stream_socket_enable_crypto():SSL 操作失败,代码为 1

使用限制排队 Guzzle 请求

设置 Laravel 5.4 以使用 React

控制器外部的 Laravel 访问请求对象

判断输入是否来自控制台

Laravel/PHPUnit:断言 json 元素存在而不定义值

如何在 vs 代码中自动导入 laravel 类

基于日期的 Laravel 日志(log)文件

Laravel 更新后用户模型错误(用户类包含 3 个抽象方法)

如何从 PHPUnit 测试设置运行 Laravel 数据库 seeder 机?