Некогда забытые директивы 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