Второе рождение SSI в nginx и robots.txt
Некогда забытые директивы SSI в наш век повышенных требований к скорости открытия страниц обретают второе рождение. Nginx умеет загружать части страниц, подключаемые через SSI, в несколько потоков. Так, например, вы можете отдавать страницу одному посетителю силами сразу нескольких серверов. Но сейчас не об этом.
SSI пригождаются не только когда нужно ускорить что-то, или показать какую-то часть статического (в чистом HTML) сайта только части посетителей, но и при генерации robots.txt.
Яндекс весьма щепетилен в том, что касается похожих сайтов. Например, если у вас на одном движке работает несколько сайтов, и для каждого сайта есть ещё какие-то зеркала, то, по мнению Яндекса, у вас в robots.txt
обязана быть директива Host
, указывающая на самое главное зеркало. Это не такая редкая ситуация, как может показаться. Если вы когда-то переводили сайт на https, то вы уже с ней столкнулись.
Значит ли это что вам всё-таки придётся поддерживать отдельный корень под каждый сайт? Держать отдельный robots.txt под каждую из версий сайта? Нет, и вот как можно сделать.
Решение для зеркал
Внутри блока server
, который отвечает за несколько доменов сразу, добавим следующее.
location = /robots.txt {
ssi on;
ssi_types text/plain;
root /home/example.com/www/htdocs;
}
А внутри robots.txt
первой строчкой.
Host: https://<!--# echo var="host" -->
Теперь робот Яндекса зайдя на каждый из сайтов увидит директиву Host
, указывающую на тот вариант сайта, на который робот зашёл.
Решение для https
Этот хак уже упоминался в инструкции по настройке бесплатных сертификатов от Let's Encrypt в части универсального переадресатора на https.
location = /robots.txt {
add_header Content-Type text/plain;
return 200 "Host: https://$host\n";
}
Так, робот Яндекса, зашедший на любую http версию любого сайта, увидит отсылку к https версии того же сайта. Проверим.
curl http://www.example.com/robots.txt
Получили желанное и ожидаемое.
Host: https://www.example.com