На моем сайте у меня есть простая форма входа. Страница обслуживается через HTTP, но POST URL формы - HTTPS.
Обычный метод состоит в том, что пользователь заполняет свое имя пользователя / пароль, форма отправляется (на полностью определенный URL-адрес HTTPS на том же сайте), а затем обработка POST выполняет 303-перенаправление на домашнюю страницу пользователя. Но иногда этого не происходит.
Цикл (и он повторяется на 100%) такой:
- Посетите форму входа, заполните данные и отправьте
- На сервере вызывается скрипт входа в систему, проверяет данные, а затем, если все в порядке, выполняет перенаправление 303 на домашнюю страницу пользователя.
- Затем я нажимаю «Выйти», а затем нажимаю «Войти», после чего я возвращаюсь в форму входа
- Затем я снова заполняю свои данные, нажимаю «отправить».
- Однако на этот раз логика входа в систему не выполняется (код отладки, который зарегистрировал имя входа на шаге 2, не вызывается), и все же я все еще перенаправлен на домашнюю страницу пользователя. Но из-за того, что я не вошел в систему успешно, меня выгнали на первую страницу ...
Так почему же POST не всегда вызывает форму входа? Я не думаю, что 303 кэшируется (и не должно быть, согласно спецификации) ...
Глядя на логи HTTPS на сервере, login.phpo вызывается первый раз, а не второй ....
Изменить:
ОК, мы решили проблему. Для тех, кто заинтересован:
Сайт работает на 2 веб-серверах за балансировщиком нагрузки. пользовательские сессии «липкие» - то есть, когда пользователь просматривает один веб-сервер, LB будет держать его «подключенным» к этому серверу. Это делается с помощью куки. Но как только мы переключаемся на HTTPS, LB не может прочитать cookie, так как соединение между браузером и веб-сервером зашифровано. Так что это было чередование между серверами. У WWe есть код для распространения аутентификации при входе между веб-серверами, но это происходит недостаточно быстро. Итак, что происходило:
- Пользователь просматривает сервер A, получает cookie с надписью «держи меня на A», вводит свои учетные данные и нажимает на кнопку «Отправить»
- LB, будучи не в состоянии расшифровать трафик HTTPS (и, следовательно, cookie), отправляет их 50% времени на B
- B проверяет логин и устанавливает аутентификацию пользователя в сеансе перед перенаправлением пользователя на домашнюю страницу не https
- Поскольку домашняя страница не https, LB читает куки и отправляет их A, который ничего не знает об аутентификации, так как он не распространялся достаточно быстро из B ...
Решение состояло в том, чтобы позволить LB дешифровать HTTPS-трафик, таким образом гарантируя, что пользователи действительно остаются на одном веб-сервере, независимо от переходов HTTP / HTTPS.