Изменить одно местоположение на основе имени сервера в Nginx

Изменить одно местоположение на основе имени сервера в Nginx

У меня есть запись сервера в моих конфигурациях с примерно 50 записями местоположений, мне нужно определить еще один домен на моем сервере с той же конфигурацией, за исключением одного местоположения.

например у меня есть

server {

    # the port your site will be served on
    # the domain name it will serve for
    listen 443 ssl;
    server_name example.com sudomain.example.com;

    ssl_certificate /etc/loc/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/loc/privkey.pem; # managed by Certbot

    proxy_set_header X-Forwarded-Proto https;

    location /static/ {
        root /srv/sites/example;
    }
... # many more location defenition


}

Мне нужно сделать что-то вроде

    location /robots.txt {
        if ($host ~ ^\w+\.\w+\.\w+$) { 
            # subdomains
            alias /srv/robots_disallow.txt;
        } else {
            alias /srv/robots.txt;
        }
    }

Если это возможно, я хочу избежать извлечения всей конфигурации в фрагмент, а затем включения его в две записи сервера: одну для основного домена и одну для поддомена.

Я знаю, что скопированный мной код не работает, и я прочиталесли это зло

что предполагает что-то

    error_page 418 = @disallow_robots;
    location /robots.txt {
        alias /srv/robots.txt;

        if ($host ~ ^\w+\.\w+\.\w+$) { 
            # subdomains
            return 418;
        }
    }

    location @disallow_robots {
        alias /srv/robots_disallow.txt;
    }

Но потом я получаюthe "alias" directive cannot be used inside the named location

решение1

Вы получите более чистое решение с помощью mapи try_filesутверждения.

Например:

map $host $robots {
    ~^\w+\.\w+\.\w+$ /robots_disallow.txt;
    default          /robots.txt;
}

server {
    ...

    location = /robots.txt {
        root /srv;
        try_files $robots =404;
    }

    ...
}

Видетьэтот документдля получения подробной информации.

Связанный контент