В рельсах (используется 5.2.3), код redirect_to events_path
отправит ответ 302 с новым URL. Этот URL содержит имя хоста, и это имя хоста берется из заголовка X-forwarded-host
запроса.
Это, кажется, не правильно и в этом случае не работает. Как и где это конкретное поведение можно изменить (или настроить) в Rails?
подробности:
Приложение rails с сервером puma работает в интрасети на http://server1.private.internal:5959/
. Разговаривает с апачем (2.4). Апач работает на www.example.org
и общается с внешним миром. Apache использует обратный прокси-сервер, поэтому приложение становится доступным как https://www.example.org/myapp
.
Это работает, за исключением redirect_to
, который не работает. Я проанализировал это и произошло следующее:
- Apache получает запрос от клиента.
- Apache передает запрос в Rails, добавляя HTTP-заголовки
X-Forwarded-Host
и X-Forwarded-Server
, содержащие www.example.org
имя хоста.
- Rails отвечает с 302 и
Location: http://www.example.org/events/
, тогда как на самом деле это должно быть Location: http://server1.private.internal:5959/events/
- Apache передает этот заголовок Location клиенту без изменений, поскольку он не содержит внутреннего имени хоста и, следовательно, не перезаписывается при обратном проксировании.
- Клиент не может использовать этот URL, потому что ему не хватает SSL и отсутствует правильный
myapp
путь.
Обход:
Apache поддерживает опцию конфигурации ProxyAddHeaders Off
. Когда это используется, он не будет добавлять эти заголовки на шаге 2. И тогда Rails отвечает с правильным внутренним URL в заголовке Location, и все работает.
Но я не хочу настраивать это в Apache, я хочу настроить или правильно кодировать его в приложении Rails. Кто-нибудь знает, где и как этого можно достичь?