У меня есть Amazon ELB, который прослушивает трафик http и https. В экземплярах за ним есть nginx на 80-м порту. Только http. Таким образом, ELB перенаправляет и https, и http на http nginx.
Когда я делаю https-запрос к папке вроде https://example.com/folder он автоматически перенаправляется на версию с косой чертой http://example.com/folder/ но протокол становится http. Папка содержит файл index.html. Я предполагаю, что это заставляет его работать.
Есть ли способ исправить это? Т.е. сделайте перенаправление на https вместо http. Я не могу использовать https во всем мире.
Моя конфигурация:
http {
map $http_x_forwarded_proto $thescheme {
default $scheme;
https https;
}
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
add_header X1 $scheme;
add_header X2 $thescheme;
index index.html;
}
}
}
Я добавил заголовки X1 и X2, чтобы проверить, какой протокол, по мнению nginx, используется, и добавлен ли заголовок X-Forwarded-Proto с помощью ELB. X1 - это http, X2 - это https для примера запроса.
Я обнаружил, что добавление
if (-d $request_filename) {
rewrite [^/]$ $thescheme://$http_host$uri/ permanent;
}
внутреннее расположение помогает, но интересно, есть ли лучшее решение.
Вместо того, чтобы использовать rewrite
, Я бы порекомендовал следовать лучшим практикам и использовать возвращение вместо этого директива. Использование этого может выглядеть следующим образом:
if ($http_x_forwarded_proto = 'http') {
return 301 https://example.com$request_uri;
}
Кроме того, для принудительного использования HTTPS
для всех клиентов, которые сделали HTTPS
запросов один раз, подумайте о добавлении Строгая безопасность транспорта HTTP (HSTS) заголовок. HSTS
является
механизм политики веб-безопасности, который помогает защитить веб-сайты от атак, связанных с понижением версии протокола и перехвата файлов cookie.
Чтобы использовать его, директива может выглядеть следующим образом:
add_header Strict-Transport-Security max-age=31536000;