Я знаю, что этот вопрос задавали бесчисленное количество раз. Я все еще не могу заставить работать с ответами, которые я видел до сих пор.
Я пытаюсь принудительно перенаправить 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;
}