Как написать правило 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;
}

Деталь $request_uri != "/check.html" может быть преобразована в пару блоков location. И поместите простой блок if внутрь одного из них.
Например:
location / {
if ($http_x_forwarded_proto != 'https') {
return 301 https://$host$request_uri;
}
...
}
location = /check.html {
...
}
См. это предупреждение об использовании if.
Вы это тестируете через обратный прокси? Вы в курсе, что ставится заголовок X-Forwarded-Proto? Если вы хотите, чтобы это работало, даже если X-Forwarded-Proto не установлен, вы можете изменить if на $http_x_forwarded_proto = 'http'.
да. Это нормально работало через Apache. Теперь я пытаюсь сделать то же самое с Nginx и обнаружил, что он не поддерживается.
У меня уже есть правило для «/», которое включает
uwsgi_pass, чтобы направлять все в веб-приложение Python. Добавление перенаправления до этого, по-видимому, полностью отключает приложение, даже если все запросы находятся под https, что, по-видимому, не активирует оператор if.