В структуре моего приложения используются 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
.
Как описано в этой статье Cloudflare добавляет заголовок X-Forwarded-Proto, который может быть HTTP или HTTPS, в зависимости от протокола, который пользователь использовал для посещения сайт. Если вы считаете, что значение X-Forwarded-Proto должно быть сохранено, но было изменено GCLB, я бы рекомендовал открыть запрос функции для этого в системе отслеживания проблем Google .
Вы можете создать промежуточное ПО:
# 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
:
CF-Visitor
Объект JSON, содержащий только один ключ называется схемой. Значение идентично значению X-Forwarded-Proto (HTTP или HTTPS). CF-Visitor актуален только при использовании гибкого SSL.