У меня есть сайт SilverStripe, работающий на двух серверах за балансировщиком нагрузки, за CloudFront. Redis хранит информацию о сеансе, и у меня есть задача синхронизации, которая синхронизирует все необходимые ресурсы. Все это работает нормально.
У меня есть форма, которая имеет различные обязательные поля. Когда форма заполнена правильно, она работает нормально и направляет человека в нужное место. Однако, если пользователь пропускает поле, он должен перенаправить обратно в форму. Вместо этого он перенаправляет их на /
, Если я щелкну обратно в браузере, он вернется к форме, и будут выделены правильные поля, которые отсутствуют.
Если я проверю это на моей локальной машине, то все будет работать как положено. Если я подключусь к одному из серверов в prod, он также будет работать нормально, даже если я переключаюсь между двумя серверами вручную.
В своих путешествиях я понял, что мне нужно определить балансировщик нагрузки в _ss_environment.php
файл:
define('SS_TRUSTED_PROXY_IPS', 'x.x.x.x/16');
define('SS_TRUSTED_PROXY_IP_HEADER', 'X-Forwarded-For');
define('SS_TRUSTED_PROXY_PROTOCOL_HEADER', 'X-Forwarded-Proto');
Я также не мог найти где TRUSTED_PROXY
был определен в рамках, поэтому я добавил
define('TRUSTED_PROXY', '1');
также.
Однако форма все еще перенаправляет на /
когда проверка не пройдена.
Что здесь происходит? Есть ли другие вещи, которые мне не хватает, чтобы определить LB?
РЕДАКТИРОВАТЬ
Я удалил CloudFront (LB все еще на месте), и теперь он работает, как и ожидалось. Я бы предпочел поставить его обратно, но я не уверен, что является причиной проблемы. Насколько я могу судить, единственное, что нужно переслать, — это файл cookie PHPSESSID, должно ли быть что-то еще?
Для CloudFront вы должны внести в белый список несколько заголовков. Для этого вопроса я считаю, что это было Referer
заголовок.
Других решений пока нет …