Назад | Перейти на главную страницу

Nginx: перенаправить http на https

Я знаю, что этот вопрос задавали бесчисленное количество раз. Я все еще не могу заставить работать с ответами, которые я видел до сих пор.

Я пытаюсь принудительно перенаправить http на https с помощью nginx. Когда я захожу на https // subdomain.example.com, все работает нормально, но при посещении http://subdomain.example.com дает мне

 "This Webpage has a redirect loop"

Я пробовал поставить

rewrite ^(.*) https://$host$1 permanent;

и

return 301 https://www.mydomain.com$request_uri;

Пытался

proxy_set_header X-Forwarded-Proto $scheme;

не решил проблему. Пожалуйста, как я могу решить эту проблему с бесконечным циклом?

Это мой nginx.conf

upstream unicorn {
server unix:/tmp/unicorn.example.sock fail_timeout=0;
}

server {
server_name subdomain.example.com;
listen 80;
return 301 https://$host$request_uri;
root /home/deploy/apps/example/current/public;

location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
proxy_set_header        X-Forwarded-Proto $scheme;
}

try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}

 error_page 500 502 503 504 /500.html;
 client_max_body_size 4G;
 keepalive_timeout 10;
}


server {
server_name subdomain.example.com;
listen 443;
root /home/deploy/apps/example/current/public;

location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
ssl on;
ssl_certificate /home/deploy/apps/example/shared/ssl_cert.crt;
ssl_certificate_key /home/deploy/apps/example/shared/ssl_private_key.key;
}#

Вероятно, это связано с вашим прокси-сервером, потому что вы отключили proxy_redirect.

Кроме того, почему вы не обслуживаете все по HTTPS?

Их сочетание может сбить с толку посетителей предупреждениями браузера.

upstream unicorn {
    server unix:/tmp/unicorn.example.sock fail_timeout=0;
}


server {

    server_name _;
    listen 80 default_server;
    return 301 https://subdomain.example.com$request_uri;

}


server {

    server_name subdomain.example.com;
    listen 443 ssl;
    ssl_certificate /home/deploy/apps/example/shared/ssl_cert.crt;
    ssl_certificate_key /home/deploy/apps/example/shared/ssl_private_key.key;
    root /home/deploy/apps/example/current/public;

    client_max_body_size 4G;
    error_page 500 502 503 504 /500.html;
    keepalive_timeout 10;

    location /assets {
        expires max;
        gzip_static on;
        add_header Cache-Control public;
    }

    location / {
        try_files $uri/index.html $uri @unicorn;
    }

    location @unicorn {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn;
    }

}

Это должно сработать, за исключением случаев, когда ваш целевой прокси-сервер делает странные вещи с отсутствующим заголовком X-Forwarded-Proto, в этом случае измените резервный вариант на это и надейтесь, что он правильно обработает перенаправление:

location @unicorn {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
    proxy_redirect off;
}