【问题标题】:Serving API routes and web routes on different ports在不同端口上提供 API 路由和 Web 路由
【发布时间】:2020-05-02 02:32:41
【问题描述】:

我有一些与我的 REST API 相关的 api 路由和一些与我的管理面板相关的 web 路由。我的员工要求我在特定端口上提供 API 路由,在另一个端口上提供管理面板,这样我们就可以阻止来自除本地网络之外的任何地方对管理面板的所有请求。我的问题是,如何在特定端口上提供 api.php 文件中的路由,并在另一个端口上提供来自 web.php 文件的所有路由。
有没有其他方法可以阻止互联网上的每个人访问 web.php 路由???

【问题讨论】:

    标签: laravel


    【解决方案1】:

    与@rostik-hvostik 提出的注册或不注册路由不同的方法是通过中间件进行验证。

    它在我们可以使用它的地方提供了更大的灵活性。

    app/Http/Middleware/ListenPort.php

    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class ListenPort
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next, ...$ports)
        {
            // I'm not sure if $ports is an array of string or integer though
            if (in_array($request->getPort(), $ports, true)) {
                return $next($request);
            }
    
            abort(403);
    
        }
    }
    

    app/Http/Kernel.php

    protected $routeMiddleware = [
            'listen' => \App\Http\Middleware\ListenPort::class,
    ]
    
    protected $middlewareGroups = [
            'web' => [
                ...,
                'listen:80',
            ],
    
            'api' => [
                ...,
                'listen:8000',
            ],
    ];
    

    【讨论】:

      【解决方案2】:

      打开RouteServiceProvider并添加一些条件

      public function map()
      {
          if (request()->getPort() === 8000) {
              $this->mapApiRoutes();
          }
      
          if (request()->getPort() === 80) {
              $this->mapWebRoutes();
          }
      }
      

      但不要忘记在你的网络服务器端口监听的配置中添加

      Nginx:

      server {
          listen 80;
          listen 8000;
          server_name example.org;
          root /var/www/;
      }
      

      Apache:

      Listen 80
      Listen 8000
      

      【讨论】:

      • 缓存路由时是否有效?我会改用中间件
      • 不,因为当您在本地调用 php artisan route:cache 时,它会从 80 端口调用,添加自定义 .env 是个好主意,例如 .env.artisan 添加一些参数 APP_ENV=artisan,并将其添加到每个 if (request()->getPort() === 8000 || app()->environment() === 'artisan') { 并调用 php artisan route:cache --env=artisan
      猜你喜欢
      • 2017-10-26
      • 2016-12-06
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多