Логический оператор И в nginx

Как написать правило Nginx для перенаправления всех запросов, отличных от https, на https, кроме определенного пути?

У меня есть путь для проверки работоспособности, который не находится под SSL, но я хочу, чтобы все остальное было перенаправлено на SSL, поэтому мне нужно такое правило, как:

if ($http_x_forwarded_proto != 'https' && $request_uri != "/check.html") {
    return 301 https://$host$request_uri;
}

но это дает мне синтаксическую ошибку. Google показывает несколько примеров выполнения логических выражений ИЛИ, но ничего для И. Поддерживается ли это в Nginx?

Обновлено: этот сервер находится за балансировщиком нагрузки, и все запросы перенаправляются на порт 80, даже если исходный запрос - https. Мне также нужно это перенаправление для работы с приложением uwsgi, настроенным как:

location / {   
    uwsgi_pass  unix:///tmp/myapp.sock;
    include     /usr/local/myapp/uwsgi_params;
}
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
1
0
3 762
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Деталь $request_uri != "/check.html" может быть преобразована в пару блоков location. И поместите простой блок if внутрь одного из них.

Например:

location / {
    if ($http_x_forwarded_proto != 'https') {
        return 301 https://$host$request_uri;
    }
    ...
}
location = /check.html {
    ...
}

См. это предупреждение об использовании if.

У меня уже есть правило для «/», которое включает uwsgi_pass, чтобы направлять все в веб-приложение Python. Добавление перенаправления до этого, по-видимому, полностью отключает приложение, даже если все запросы находятся под https, что, по-видимому, не активирует оператор if.

Cerin 10.11.2018 17:48

Вы это тестируете через обратный прокси? Вы в курсе, что ставится заголовок X-Forwarded-Proto? Если вы хотите, чтобы это работало, даже если X-Forwarded-Proto не установлен, вы можете изменить if на $http_x_forwarded_proto = 'http'.

Richard Smith 10.11.2018 17:54

да. Это нормально работало через Apache. Теперь я пытаюсь сделать то же самое с Nginx и обнаружил, что он не поддерживается.

Cerin 10.11.2018 21:43

Другие вопросы по теме