복붙노트

[REDIS] 봇에 대한 Laravel 세션 없다

REDIS

봇에 대한 Laravel 세션 없다

나는 큰 Laravel 프로젝트와 레디 스 저장에 문제가 있어요. 우리는 레디 스에서 우리의 세션을 저장합니다. 우리는 이미 RAM의 28기가바이트 있습니다. 우리는 검색 엔진 로봇에서 매우 많은 안타 (하루 이상 250000)을 가지고 있기 때문에 그러나, 여전히 상대적으로 빠른 한계로 실행됩니다.

로봇에 대한 완전히 비활성화 세션에 대한 우아한 방법이 있나요? 난 이미 다음과 같습니다 내 자신의 세션 미들웨어를 구현 한 :

<?php

namespace App\Http\Middleware;

use App\Custom\System\Visitor;

class StartSession extends \Illuminate\Session\Middleware\StartSession
{
    protected function getSessionLifetimeInSeconds()
    {
        if(Visitor::isBot()) {
            return 1;
        }

        return ($this->manager->getSessionConfig()['lifetime'] ?? null) * 60;
    }

    protected function sessionIsPersistent(array $config = null)
    {
        if(Visitor::isBot()) {
            return false;
        }

        $config = $config ?: $this->manager->getSessionConfig();

        return ! in_array($config['driver'], [null, 'array']);
    }
}

이 봇을 검출 내 기능입니다 :

public static function isBot()
    {
        $exceptUserAgents = [
            'Googlebot',
            'Bingbot',
            'Yahoo! Slurp',
            'DuckDuckBot',
            'Baiduspider',
            'YandexBot',
            'Sogou',
            'facebot',
            'ia_archiver',
        ];

        if(!request()->header('User-Agent') || !str_contains(request()->header('User-Agent'), $exceptUserAgents)) {
            return false;
        }

        return true;
    }

불행하게도,이 작동하지 않습니다. 사람은 팁 또는 여기에 경험이 있습니까? 대단히 감사합니다!

해결법

  1. ==============================

    1.나 자신이 해결 방법이다.

    나 자신이 해결 방법이다.

    namespace App\Http\Middleware;
    
    class NoSessionForBotsMiddleware
    {
        public function handle($request, \Closure $next)
        {
            if ((new \Jaybizzle\CrawlerDetect\CrawlerDetect)->isCrawler()) {
                \Config::set('session.driver', 'array');
            }
    
            return $next($request);
        }
    }
    
    protected $middlewareGroups = [
        'web' => [
            // ..
            NoSessionForBotsMiddleware::class,
            StartSession::class,
            // ..
        ],
        // ..
    ];
    
  2. ==============================

    2.올바르게 로봇을 식별하지 않는 것을하면 해당의 코드를 제공하기 위해 도움이 될 것입니다 귀하의 문제가 될 수 있습니다.

    올바르게 로봇을 식별하지 않는 것을하면 해당의 코드를 제공하기 위해 도움이 될 것입니다 귀하의 문제가 될 수 있습니다.

    비활성화 세션, 당신은 훨씬 더 세션을 유지하지 않는 드라이버로 배열 드라이버 세션 드라이버를 변경 떨어져 걸 미들웨어를 작성하는 대신 런타임에 실제 세션 드라이버의 구성을 변경하는 구체적인.

    <?php
    
    namespace App\Http\Middleware;
    
    use App\Custom\System\Visitor;
    use Illuminate\Support\Facades\Config;
    
    class DiscardSessionIfBot
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (Visitor::isBot()) {
                Config::set('session.driver', 'array');
            }
    
            return $next($request);
        }
    }
    
  3. from https://stackoverflow.com/questions/51176946/no-laravel-sessions-for-bots by cc-by-sa and MIT license