Пропуск конфигурации Nginx if в родительском блоке местоположения - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть следующие настройки:

location @public {
    auth_basic off;
}
location @webdav {
    proxy_set_header Host $host;
    proxy_pass http://localhost:8080;
}
location / {
    # WebDAV server
    if ($request_method != GET) {
        error_page 418 = @webdav;
        return 418;
    }
    gzip on;
    fancyindex on;

    location ~ /(public|\.well-known)/ {
        if ($remote_user = "") {
            error_page 418 = @public;
            return 418;
        }
    }
    location = /robots.txt {
        add_header Content-Type text/plain;
        return 200 "User-agent: *\nDisallow: /\n";
    }
}

Я хочу перенаправить каждый не GET-запрос в мой внутренний обработчик WebDAV, написанный на Go.Папка /public должна быть доступна без базовой аутентификации, в отличие от остальной файловой системы.

Однако для вложенных блоков местоположения мой родительский оператор if, кажется, игнорируется.Попытка любого не-GET запроса на /public приводит к 505, а на /robots.txt возвращает мой сконфигурированный текст.Однако это не относится к gzip или fancyindex, так как /public и robots.txt сжаты и проиндексированы.

1 Ответ

0 голосов
/ 15 декабря 2018

Оказывается, проблема заключалась в порядке, в котором nginx обрабатывает блоки.Сначала выполняются два вложенных блока местоположения, а затем только родительские операторы местоположения.Поскольку мои вложенные блоки местоположения оба возвращают, родительские операторы местоположения никогда не достигаются.Решением было добавить мой код WebDAV в начало каждого из этих вложенных блоков местоположения.Конечный код:

location @public {
    auth_basic off;
}
location @webdav {
    proxy_set_header Host $host;
    proxy_pass http://localhost:8080;
}
location / {
    # WebDAV server
    if ($request_method != GET) {
        error_page 418 = @webdav;
        return 418;
    }
    gzip on;
    fancyindex on;

    location ~ /(public|\.well-known)/ {
        # WebDAV server
        if ($request_method != GET) {
            error_page 418 = @webdav;
            return 418;
        }
        if ($remote_user = "") {
            error_page 418 = @public;
            return 418;
        }
    }
    location = /robots.txt {
        # WebDAV server
        if ($request_method != GET) {
            error_page 418 = @webdav;
            return 418;
        }
        add_header Content-Type text/plain;
        return 200 "User-agent: *\nDisallow: /\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...