Рубрики
Wordpress

Виртуальный robots.txt в WordPress, ошибка 404 и nginx

Во время работы над очередным сайтом на WordPress возникла необходимость генерировать robots.txt «на лету». К счастью, для этого WordPress располагает удобным функционалом — хуками robots_txt и do_robotstxt.

Так, например, можно создать виртуальные robots.txt

add_action( 'do_robotstxt', 'make_robotstxt' );
function make_robotstxt(){

$lines = [
'User-agent: *',
'Disallow: /wp-admin/',
'Disallow: /wp-login.php',
'',
];

echo implode( "\r\n", $lines );

die; 
}

А так можно внедриться в уже созданный в другом месте кода robots.txt

add_filter( 'robots_txt', 'change_robotstxt', -1 );
function change_robotstxt( $text ){
$text .= "Disallow: */page";
return $text;
}

Казалось бы, всё просто и понятно, однако вместо нужного содержимого robots.txt я получал 404 ошибку.

Судя по всему, wordpress даже не обрабатывал запрос при переходе на https://example.com/robots.txt

Оказалось, проблема была в конфиге nginx:

location = /robots.txt { allow all; access_log off; log_not_found off; }

Nginx пытался найти в корне файл robots.txt (которго, не было) и отдавал ошибку 404.

Кстати, такой конфиг рекомендуется в официальной документации WordPress: https://wordpress.org/support/article/nginx/ Это довольно странно.

Исправить проблему достаточно просто. Меняем эту строку на следующую, и всё работает. Обращение к robots.txt обрабатывает WordPress.

location = /robots.txt {
try_files $uri $uri/ /index.php?$args;
access_log off;
log_not_found off;
}

Можно поступить ещё проще, просто удалив или закомментировав строку

#location = /robots.txt { allow all; access_log off; log_not_found off; }

Перезапускаем nginx и наслаждаемся.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *