Nginx: условное перенаправление на имя сервера и поддомен для коротких URL-адресов

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

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name company.com compa.ny;
    ssl on;
    ssl_client_certificate /etc/ssl/certs/godaddy_CA.crt;
    ssl_certificate /etc/ssl/certs/wildcard.company.com.crt;
    ssl_certificate_key /etc/ssl/private/wildcard.company.com.key;
    ssl_prefer_server_ciphers on;
    root /var/www/company;
    access_log /var/log/nginx/nginx.access.log;
    error_log /var/log/nginx/nginx.error.log;
    client_max_body_size 8M;
    location ^~ /application {
        proxy_set_header HOST $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080;
    }
}

Я хочу иметь что-то, что ищет хост с коротким URL-адресом «compa.ny» и перенаправляет на «company.com/shortUrldRedirector», и я также хочу включить поддомен, поэтому в dev или qa это будет работать правильно:

https://compa.ny/abc123 -> https://company.com/shortUrldRedirector/abc123

and

https://dev.compa.ny/abc123 -> https://dev.company.com/shortUrldRedirector/abc123

Я вижу, что есть переменная конфигурации $server_name, но как мне выполнить вышеуказанные перенаправления с учетом поддомена?


person David Williams    schedule 05.12.2013    source источник


Ответы (1)


Я бы использовал построение карты следующим образом:

map $http_host $long_domain {
    default      company.com;
    dev.compa.ny dev.company.com;
    compa.ny     company.com;
}

server {
    ...
    return 301 https://$long_domain/shortUrldRedirector$request_uri;
}
person ig0r    schedule 05.12.2013
comment
Это интересно, позвольте мне попробовать это. Одну секунду. - person David Williams; 06.12.2013
comment
Можно ли использовать в карте регулярные выражения, например dev\d+.compa.ny? - person David Williams; 06.12.2013
comment
да, вы должны начинать выражение с ~, например ~dev[0-9]*.compa.ny - person ig0r; 06.12.2013
comment
Как вы думаете, что-то подобное будет считаться дурным тоном? if($host ~ "^(.*?)\.compa.ny") { return 301 https://$1.company.com/ShortUrlRedirect/$request_uri; } Я считаю, что мне нужно какое-то условие перед возвращаемым значением выше. - person David Williams; 06.12.2013