Как заставить Google Cloud Load Balancer учитывать полученный X-Forwarded-Proto?

В структуре моего приложения используются GKE и CloudFlare. Выглядит это так:

CloudFlare -> GKE -> Ingress -> Мое приложение с nginx

Я использую гибкий SSL в CloudFlare, поэтому только соединение между пользователем и CloudFlare использует HTTPS, все остальные используют HTTP. Я знаю, что CloudFlare в этой ситуации устанавливает X-Forwarded-Proto на https , но когда я вижу заголовки, которые получает мое приложение nginx, оно получает X-Forwarded-Proto : http .

Я почти уверен, что это происходит где-то между балансировщиком нагрузки GKE и Ingress, поскольку я вижу, что заголовок CF-Visitor: {"scheme": "https"} настроенный CloudFlare установлен на HTTPS. Насколько я понимаю, это означает, что CloudFlare установил X-Forwarded-Proto на https , но при этом он был перезаписан.

К сожалению, я не смог получить заголовок журналы из GKE Load Balancer (похоже, они вообще не регистрируют заголовки X-Forwarded - * ), поэтому я не могу на 100% подтвердить, что CloudFlare действительно устанавливает заголовки, но я ' Буду очень удивлен, если это не так.

Если это правда, Google Cloud перезаписывает заголовок X-Forwarded-Proto на http . Как мне этого избежать?

Изменить: Я настроил вход nginx вместо gce после https://cloud.google.com/community/tutorials/nginx-ingress-gke , а X-Forwarded-Proto установлен на https , как и ожидалось. Это еще один сигнал о том, что входной контроллер gce перезаписывает заголовок X-Forwarded-Proto .

6
задан 14 May 2018 в 22:19
2 ответа

Как описано в этой статье Cloudflare добавляет заголовок X-Forwarded-Proto, который может быть HTTP или HTTPS, в зависимости от протокола, который пользователь использовал для посещения сайт. Если вы считаете, что значение X-Forwarded-Proto должно быть сохранено, но было изменено GCLB, я бы рекомендовал открыть запрос функции для этого в системе отслеживания проблем Google .

0
ответ дан 3 December 2019 в 00:44

Вы можете создать промежуточное ПО:

# frozen_string_literal: true

require 'json'

class CloudflareProxy
  def initialize(app)
    @app = app
  end

  def call(env)
    return @app.call(env) unless env['HTTP_CF_VISITOR']

    env['HTTP_X_FORWARDED_PROTO'] = JSON.parse(env['HTTP_CF_VISITOR'])['scheme']
    @app.call(env)
  end
end

Используйте в config / application.rb :

config.middleware.use CloudflareProxy

Ссылка на заголовок CF-Visitor :

https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-

CF-Visitor

Объект JSON, содержащий только один ключ называется схемой. Значение идентично значению X-Forwarded-Proto (HTTP или HTTPS). CF-Visitor актуален только при использовании гибкого SSL.

0
ответ дан 24 December 2019 в 03:52

Теги

Похожие вопросы