Нет сессий Laravel для ботов - PullRequest
0 голосов
/ 04 июля 2018

У меня проблемы с большим проектом Laravel и хранилищем Redis. Мы храним наши сессии в Redis. У нас уже есть 28 ГБ оперативной памяти. Тем не менее, он все еще работает относительно быстро до предела, потому что у нас очень много обращений (более 250 000 в день) с поисковых роботов.

Есть ли какой-нибудь элегантный способ полностью отключить сеансы для ботов? Я уже реализовал свое собственное промежуточное программное обеспечение сеанса, которое выглядит так:

<?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;
    }

К сожалению, это не похоже на работу. У кого-нибудь есть совет или опыт здесь? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вот как я решил это для себя.

  1. Включите пакет обнаружения ботов с помощью composer. Я использовал это: https://github.com/JayBizzle/Crawler-Detect

    composer require jaybizzle/crawler-detect

  2. Создание нового класса промежуточного программного обеспечения

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);
    }
}
  1. Зарегистрируйте промежуточное программное обеспечение до промежуточного программного обеспечения сеанса в Kernel классе:
protected $middlewareGroups = [
    'web' => [
        // ..
        NoSessionForBotsMiddleware::class,
        StartSession::class,
        // ..
    ],
    // ..
];
0 голосов
/ 04 июля 2018

Ваша проблема может заключаться в том, что вы неправильно идентифицируете роботов, поэтому было бы полезно предоставить код для этого.

Специально для написания промежуточного программного обеспечения, которое отключает сеансы, вам гораздо лучше изменить драйвер сеанса на драйвер array, так как этот драйвер не сохраняет сеансы, вместо изменения конфигурации реального драйвера сеанса во время выполнения.

<?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);
    }
}
...