<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-04-18
* Time: 21:17
*/
namespace App\Controller;
use App\Http\Crawler\CrawlerDetector;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class RobotsTxtController extends AbstractController
{
protected CrawlerDetector $crawlerDetector;
public function __construct(CrawlerDetector $crawlerDetector = null)
{
$this->crawlerDetector = $crawlerDetector ?? new CrawlerDetector();
}
/**
* @see https://redminez.net/projects/belochki/wiki/%D0%A0%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%9F%D0%A1_%D0%B8_%D0%A0%D0%9A%D0%9D
*/
#[Route(path: '/robots.txt')]
#[Cache(smaxage: 0)]
public function page(Request $request, ParameterBagInterface $parameterBag): Response
{
$currentHost = $request->getHost();
$mainDomain = $parameterBag->get('app.main_domain');
if ($currentHost !== $mainDomain && !preg_match('/\.'.preg_quote($mainDomain).'$/', $currentHost)) {
// Вход на один из старых доменов
$userAgent = $request->headers->get('User-Agent', '');
if (!$this->crawlerDetector->isCrawler($userAgent)) {
// Для не-ботов ПС в качестве хоста отдаем корень старого домена
$hostParts = explode('.', $currentHost);
$count = count($hostParts);
$mainDomain = sprintf('%s.%s', $hostParts[$count-2], $hostParts[$count-1]);
}
}
$sitemapHttps = $parameterBag->get('app.sitemap.https');
$sitemapGzip = $parameterBag->get('app.sitemap.gzip');
$sitemapDirectory = $parameterBag->get('app.sitemap.directory');
$sitemapPath = rtrim($sitemapDirectory, '/').'/sitemap.xml';
if (true === $sitemapGzip) {
$sitemapPath .= '.gz';
}
$sitemapUrl = sprintf('%s://%s/%s', true === $sitemapHttps ? 'https' : 'http', $mainDomain, ltrim($sitemapPath, '/'));
$schemePrefix = $request->isSecure() ? 'https_' : 'http_';
$view = $this->renderView("{$schemePrefix}robots.txt.twig", [
'host' => $mainDomain,
'sitemap_url' => $sitemapUrl,
]);
$response = new Response($view, Response::HTTP_OK, [
'Content-Type' => 'text/plain; charset=utf-8',
]);
return $response;
}
}