nginx удалить операторы if

nginx удалить операторы if

Я ищу небольшой совет для новичка в nginx. Я читал, что операторы if в nginx работают очень медленно, поэтому я надеялся на небольшую помощь в их преобразовании. Я перепробовал кучу разных методов, все безуспешно, поэтому я решил задать вопрос.

server_name *.noconformity.co noconformity.co;
# remove all sub domains and www
if ($http_host !~* "^(ftp|ssh)\.noconformity\.co$"){
    set $rule_0 1$rule_0;
}
if ($http_host ~ "^([^.]+)\.noconformity\.co$"){
    set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
    rewrite ^/(.*)$ http://noconformity.co/$1 permanent;
    break;
}
# Login Short Cut
if ($uri ~* "/login") {
    rewrite ^/login(/.*)? /wp-admin$1;
}

решение1

Полностью не проверено — вполне вероятно, что есть ошибки — но, надеюсь, концепция верна.

Приведенная ниже конфигурация основана на том, как я понимаю вашу цель: перенаправить все поддомены, кроме «ftp» и «ssh», на основной сайт; перенаправить /login на /wp-admin

Создайте блок сервера для приема подключений к поддоменам ftp и ssh, а затем сделайте здесь что-нибудь (например, отклоните или верните 403 и т. д.) — поскольку это статическое имя_сервера, оно имеет приоритет над подстановочным именем_сервера.

server {
    server_name ftp.noconformity.co ssh.noconformity.co;
    #additional options
}

Ваш основной блок сервера — добавьте вашу переписку в блок местоположения

server{
    server_name noconformity.co;
    #root ....; 
    #your main config

    location ~* /login/ {
        rewrite ^/login/(.*)? /wp-admin$1;
    }
}

{Мне пришлось изменить перезапись /login/, чтобы избежать зацикливания со встроенным в WP перенаправлением входа}

Наконец, подстановочный символ server_name — он будет соответствовать любому поддомену (кроме уже сопоставленных), захватит путь и перепишет на ваш основной сайт.

server {
    server_name *.noconformity.co;
    rewrite ^/(.*)$ http://noconformity.co/$1 permanent;
}

Nginx-серверстраница на server_namesстоит прочитать, так как в нем объясняется приоритет различных выражений server_name.

решение2

Лучшим ответом на этот вопрос будет использованиеМодуль HTTP-карты. Ваш пример выше почти такой же, как и тот, который они продемонстрировали. Гораздо чище и проще в управлении.

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