
Zitat von
Spooky
Du könntest aber auch die Seite auf noindex belassen, dafür aber die Einstellung bzw. Ausgabe dynamisch ändern, je nach User-Agent (der Contao Crawler schickt einen spezifischen User-Agent mit).
Ich habe diese Methode für News-Artikeln ausprobiert:
PHP-Code:
// contao/dca/tl_news.php
// Neues Robots-Feld für den Contao-Crawler:
$GLOBALS['TL_DCA']['tl_news']['fields']['custom_contao_crawler_robots'] = [
'label' => array('Robots-Tag-Anpassung für den Contao-Crawler', 'Für die Suchfunktion auf der Website'),
'search' => true,
'inputType' => 'select',
'options' => array('index,follow', 'index,nofollow', 'noindex,follow', 'noindex,nofollow'),
'eval' => array('includeBlankOption' => true, 'tl_class'=>'w50'),
'sql' => array('type' => 'string', 'length' => 32, 'notnull' => true, 'default' => '')
];
PaletteManipulator::create()
->addField('custom_contao_crawler_robots', 'robots', PaletteManipulator::POSITION_AFTER)
->applyToPalette('default', 'tl_news')
;
PHP-Code:
// src/EventListener/ParseArticlesListener.php
namespace App\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\FrontendTemplate;
use Contao\Module;
use Contao\CoreBundle\Routing\ResponseContext\HtmlHeadBag\HtmlHeadBag;
use Contao\CoreBundle\Routing\ResponseContext\ResponseContextAccessor;
#[AsHook('parseArticles')]
class ParseArticlesListener {
private ResponseContextAccessor $responseContextAccessor;
public function __construct(ResponseContextAccessor $responseContextAccessor) {
$this->responseContextAccessor = $responseContextAccessor;
}
public function __invoke(FrontendTemplate $template, array $newsEntry, Module $module): void {
// User-Agent des aktuellen Aufrufs (im Request Objekt > Headers)
$request = \Contao\System::getContainer()->get('request_stack')->getCurrentRequest();
$user_agent = $request->headers->get('user-agent');
// Falls es der "contao/crawler" ist: Ggf. angepasste Robots-Einstellung verwenden
if ( $user_agent == 'contao/crawler' && !empty($newsEntry['custom_contao_crawler_robots']) ) {
$htmlHeadBag = $this->responseContextAccessor->getResponseContext()->get(HtmlHeadBag::class);
$htmlHeadBag->setMetaRobots($newsEntry['custom_contao_crawler_robots']);
}
}
}
Das funktioniert auch, aber leider nur teilweise.
Test-Einstellung: Allgemeine Robots "noindex", für den Contao-Crawler "index".
Wenn der Suchindex über das Backend aktualisiert wird, ist die Seite über die Website-Suche auffindbar.
Wenn die Seite im Browser mit DevTools mit dem User-Agent "contao/crawler" aufgerufen wird, wird auch "index,follow" im Quelltext der Seite angezeigt, bei anderen User-Agents "noindex,follow". Theoretisch also alles richtig.
Aber sobald die Seite im Browser mit einem anderen User-Agent als "contao/crawler" aufgerufen wurde, ist sie nicht mehr in den Contao-Suchergebnissen enthalten/auffindbar.
Ich vermute, der Suchindex wird für die betroffenen Seite bei jedem Aufruf aktualisiert und da der Browser einen anderen User-Agent hat, für den "noindex" gilt, speichert Contao diese Einstellung entsprechend?
Kann dieses Verhalten umgangen/angepasst werden?