Я не могу перенаправить HTTP на HTTPS с помощью Apache из-за наличия более одного прокси между клиентом и сервером.
HTTPS - это прерывается в Интернет-балансировщике нагрузки, все другие устройства (включая сервер Apache, обслуживающий запросы) используют HTTP.
Я вижу, что все, на что Apache смотрит, это X-Forwarded-Proto последнего прокси в цепочке , то есть HTTP.
Как я могу заставить его смотреть на настоящий заголовок X-Forwarded-Proto (удаленного клиента)?
Для перенаправлений, исходящих из HTTP-бэкэнда, единственная директива, которую вы Следует учитывать, что обратный прокси-сервер:
ProxyPassReverse
Если перенаправление происходит из цепочки обратных прокси-серверов, независимо от того, что они отправляют, если у вас есть директива ProxyPassReverse для любого внутреннего имени, Apache изменит хост в Местоположение и схема (http / s), изначально присланные клиентом.
Хорошо, что ProxyPassReverse можно указывать столько раз, сколько необходимо.
Так, например, если ваш обратный прокси-сервер размещает общедоступный ] https://main.example.com и у вас есть множество бэкэндов, которые отправляют вам перенаправления, например:
Location: http://something.example.com/somesome
Location: http://otherthing.internal.example.com/heresomething/jkjljl.whatever
Location: http://deepdowninthechain.some.exampe.com/therethere/there/there
Все, что вам нужно сделать, это добавить:
ProxyPassReverse / http://something.example.com/
ProxyPassReverse / http://otherthing.internal.example.com/
ProxyPassReverse / http://deepdowninthechain.some.exampe.com/
И Apache HTTPD вернет все эти заголовки Location в то, что запрашивал исходный клиент: https://main.example.com/whatever ...