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;
}
}