nginx try_files выдает http перенаправление на балансировщик нагрузки; нужен https

Мой экземпляр nginx находится за балансировщиком нагрузки с прерыванием по SSL, и я хочу, чтобы все URL обращались https конечные точки, что означает http быть перенаправленным на https,

Все хорошо, когда URL имеют косую черту. Все они перенаправлены красиво:

#!/bin/sh

do_curl() {
   echo "\n$ do_curl $1"
   curl -L -s -D - "$1" -o /dev/null | grep -iE 'Location|HTTP/|server'
}

$ do_curl https://example.com/
HTTP/2 200

$ do_curl http://example.com/foo/
HTTP/1.1 301 Moved Permanently
Location: https://example.com/foo/
HTTP/2 200

$ do_curl https://example.com/foo/
HTTP/2 200

Но когда те же URL-адреса не имеют косой черты, nginx try_files похоже выдаёт http редирект всегда: bad.png

Вот мой nginx vhost.conf:

server {
    listen 80;
    root /app/;
    index index.html index.htm;

    # This 'if' block is only needed because my SSL-terminated Load balancer proxies both http and https to nginx.
    # If my Load balancer only proxied https to nginx, and dropped http, this 'if' block can be omitted.
    if ($http_x_forwarded_proto = "http") {
        return 301 https://$host$request_uri;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

Как я могу получить nginx try_files перенаправить непосредственно с https$scheme когда он попадает в $uri/ параметр (2-й параметр в моем try_files выше) и успешно находит соответствующий файл $uri/<index> (где index определяется index директива в конфиге nginx выше)?

Я искал похожие вопросы, такие как здесь, здесь или здесь, но все еще не мог найти ничего отдаленно релевантного.

1 ответ

Решение

Как отметил @Florin в комментариях к вопросу, try_files только выполняет переписывает. Поэтому я вернулся и опустил try_files блок в моем vhost.conf и достаточно верно, я вернулся к тому же поведению, где https URL без косой черты перенаправляются на его http прицепной аналог.

Решение

Вместо этого заголовок моего вопроса должен был быть больше похож на "Как предотвратить перенаправление nginx с HTTPS на HTTP", что было бы дубликатом вопроса " Как предотвратить перенаправление nginx с HTTPS на HTTP на AWS?". тот @Richard указал в своем комментарии на мой вопрос, и на который он ответил.

По совпадению, мои обстоятельства и вопрос фактически идентичны тем в этом вопросе. В своем ответе @Richard указывает, что лучший способ смягчить проблему, когда nginx предполагает то же самое $scheme так как запрашивающая сторона (то есть балансировщик нагрузки с прекращением SSL) будет делать замену http с https в Location заголовок в точке балансировки нагрузки, что было невозможно для меня. Затем он продолжает описывать три способа при выполнении перенаправлений, где $scheme было бы https,

Из трех решений, которое мне помогло, было использовать absolute_redirect off;, Это предотвратило использование nginx неправильным $scheme что он использовал в перенаправлениях.

Теперь мой vhost.conf просто должно быть:

server {
    listen 80;
    root /app/;
    index index.html index.htm;

    absolute_redirect off;

    # This 'if' block is only needed because my SSL-terminated Load balancer proxies both http and https to nginx.
    # If my Load balancer only proxied https to nginx, and dropped http, this 'if' block can be omitted.
    if ($http_x_forwarded_proto = "http") {
        return 301 https://$host$request_uri;
    }
}
Другие вопросы по тегам