Я использую балансировщик нагрузки Rackspace, который позволяет мне настроить свой ssl-ключ / pem внутри панели администратора. Все работает нормально, могу использовать как протоколы http, так и https. Но если я попытаюсь перенаправить http на https, используя:
server{
listen *:80;
server_name mydomain.com www.mydomain.com;
rewrite ^ https://mydomain.com$request_uri? permanent;
... Я получаю цикл перенаправления. Я понимаю, что не слушаю порт 443, но это потому, что балансировщик нагрузки сделал это за меня. Я также пробовал обернуть перезапись в if ($scheme ~* http){
но безрезультатно.
Другая часть моего вопроса заключается в том, что я хотел бы удалить www из URL-адреса, могу ли я сделать это с помощью одной перезаписи? Не следует ли об этом позаботиться и вышеупомянутый перезапись?
Спасибо за вашу помощь!
Используя встроенные серверные переменные nginx $request_uri
и $server_name
вы можете сделать это вообще без использования регулярных выражений. Добавьте следующее к вашему серверу location
блок и все готово:
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
Предполагается, что ваш балансировщик нагрузки отправляет $http_x_forwarded_proto
заголовок вместе с запросом к вашему экземпляру (-ам) серверной части. Другие распространенные заголовки включают $http_x_forwarded_scheme
а также просто $scheme
.
Более подробную информацию можно найти в nginx Подводные камни и распространенные ошибки документация : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites
sciurus верен в том, что облачные балансировщики нагрузки Rackspace устанавливают для X-Forwarded-Proto значение https, когда SSL выгружается на балансировщике нагрузки. Чтобы избежать цикла перенаправления в nginx, вы должны иметь возможность добавить следующее в location
раздел в конфигурации vhost:
if ($http_x_forwarded_proto = "http") {
rewrite ^/(.*)$ https://mydomain.com/$1 permanent;
}
Это должно избежать бесконечного цикла перенаправления при перенаправлении запросов, отличных от https, на https.
Балансировщик нагрузки всегда разговаривает с вами по http. Что происходит
Шаги 2–4 повторяются, пока браузер не обнаружит петлю перенаправления и не откажется от нее.
РЕДАКТИРОВАТЬ: Чтобы решить эту проблему, выполняйте перезапись только тогда, когда заголовок X-Forwarded-Proto установлен на http. С помощью этого заголовка балансировщик нагрузки Rackspace сообщает вашему веб-серверу протокол, по которому он получил запрос.