Во время работы над очередным сайтом на WordPress возникла необходимость генерировать robots.txt «на лету». К счастью, для этого WordPress располагает удобным функционалом — хуками robots_txt и do_robotstxt.
Так, например, можно создать виртуальные robots.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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
1 2 3 4 5 |
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:
1 |
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.
1 2 3 4 5 |
location = /robots.txt { try_files $uri $uri/ /index.php?$args; access_log off; log_not_found off; } |
Можно поступить ещё проще, просто удалив или закомментировав строку
1 |
#location = /robots.txt { allow all; access_log off; log_not_found off; } |
Перезапускаем nginx и наслаждаемся.
2 ответа к “Виртуальный robots.txt в WordPress, ошибка 404 и nginx”
Столкнулся с такой же проблемой. Однако после внесения указанных изменений в конфиг, вместо 404 ошибки стал 301 редирект на морду.
8t4xij