Перенаправляйте весь HTTP-трафик на HTTPS при использовании балансировщика нагрузки HTTP (S) в Google Compute Engine

18

Я настроил балансировку нагрузки HTTP / HTTPS в Google Compute Engine с двумя правилами глобальной пересылки (HTTP и HTTPS). Каждое правило указывает на серверную службу с протоколом HTTP.

Я хочу, чтобы все запросы http://*отправлялись https://*.

Поскольку балансировщик нагрузки общается с внутренними службами через HTTP, я не думаю, что могу получить nginx на внутреннем сервисе для отправки обратно a 301.

Я пробовал дюжину небольших изменений в Google Compute, и все они в итоге возвращают Google Compute 502.

Я уверен, что кто-то еще настраивал это раньше. Любые советы или указатели в правильном направлении очень ценятся.

Райан Лекей
источник
Перенаправление HTTP на HTTPS (с использованием SSL) в настоящее время не поддерживается через балансировщик нагрузки HTTP / HTTPS. Перенаправление должно быть настроено на вашем веб-сервере (apache, nginx и т. Д.). С учетом вышесказанного , пожалуйста, не стесняйтесь подать запрос на функцию для этого на общедоступном трекере Compute Engine ( code.google.com/p/google-compute-engine/issues/list ).
Файзан
Спасибо; открыл вопрос: code.google.com/p/google-compute-engine/issues/…
Райан Лики
Хорошо, отлично, я перенаправил запрос на добавление в проект.
Файзан
@Faizan - есть ли сроки, когда эта функция будет доступна? Прошло около 2 лет с момента запроса функции. Обходной путь неуклюж.
Талон
Новая ссылка для этого запроса - issetracker.google.com/issues/35904733 (хотя старая по-прежнему перенаправляет).
Даниэль Комптон

Ответы:

19

У нас аналогичная настройка с использованием балансировщика нагрузки HTTP / HTTPS, и нам удалось принудительно установить HTTPS. Это невозможно напрямую из балансировщика нагрузки, но вы можете настроить его из своей бэкэнд-службы. Балансировщик нагрузки Google Cloud установит заголовок X-Forwarded-Proto http со значением http или https. Вы проверяете этот заголовок в своем бэкэнд-сервисе (в нашем случае это Varnish, но это также может быть сделано в Nginx), и если значение равно http, вы отправляете обратно 301.

Леннерт Куйперс
источник
8
Благодарность! Ради потомков: if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }
Райан Лекей
Вы должны использовать 426заголовок обновления HTTP, а не 301. Подробнее: stackoverflow.com/questions/17873247/…
Викрам Тивари
3
Я не согласен с Викрамом, вы должны использовать 301 для целей SEO. Если вы вернете код семейства 4xx, ваш PageRank не будет переходить от ссылок, указывающих на старый http, к https. 301 - ожидаемый код, по крайней мере, если вы заботитесь о SEO на своем сайте.
Cyrrill
1
@VikramTiwari, в ответе на пост фактически говорится: «Дело даже не в обновлении с http: // до https: // вообще»
Рамбатино,
1

Я столкнулся с этой проблемой сегодня и смог решить ее с помощью балансировки нагрузки TCP. Если вам не нужны специальные параметры балансировки нагрузки HTTP / HTTPS, возможно, вы можете использовать балансировщик нагрузки TCP (без SSL) для получения трафика на порты 80 и 443. Для трафика от порта 80 вы можете отправить обратно 301.

gselva
источник
1
tcp балансировка нагрузки не разрешена для порта 80 doc > TCP Proxy Load Balancing поддерживает следующие порты: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222
Джованни Торальдо