Ответил, чтобы помочь людям, которые могут наткнуться на это
Как ответ на Сеанс потерян при переключении с HTTP на HTTPS в PHP завершен, так как вы используете session.cookie_secure = 1
cookie, который содержит идентификатор сеанса, не передается, когда соединение переключается с HTTPS в HTTP. При подключении HTTP, когда вы session_start()
, PHP создает новый идентификатор сеанса, который заменяет предыдущий идентификатор сеанса.
Ответ также предлагает решение: передайте идентификатор сеанса, используя строку запроса, которая затем выбирается страницей. Это пахнет плохим недостатком безопасности. Не забывайте причину, по которой мы в первую очередь использовали HTTPS!
Итак, решение, которое я предлагаю вам, заключается в том, чтобы вы перенаправили весь http-запрос на коллеги https . Используйте HTTPS для всего на вашем сайте, от CSS, изображений до обычных статических HTML-страниц. Это действительно то, что делает каждое приложение, которое серьезно относится к безопасности. Например, посещение страницы github с использованием HTTP вернет:
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.67
Date: Sun, 08 May 2011 15:43:01 GMT
Content-Type: text/html
Content-Length: 185
Connection: close
Location: https://github.com/
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/0.7.67</center>
</body>
</html>
Помните, почему вы в первую очередь использовали HTTPS, если вы хотите быть полностью безопасным, используйте HTTPS для всего.
Определить, является ли запрос HTTPS или нет (см. Этот вопрос) при загрузке.
Если запрос HTTP, либо перенаправьте все запросы на домашнюю страницу HTTPS, либо попробуйте выполнить синтаксический анализ $_SERVER['REQUEST_URI']
и перенаправить HTTP-запрос их коллеге HTTPS с помощью parse_url
и http_build_url
.
Второе альтернативное решение
Если вы действительно не хотите использовать HTTPS для всего, не используйте session_start()
на страницах, к которым осуществляется доступ по HTTP. Безопасные куки будут сохранены, когда вы сделаете это.
Третье альтернативное решение
Другое решение - попытаться обнаружить пользователя по IP-адресам и пользовательскому агенту. Это не гарантирует точности, поэтому я предлагаю просто использовать HTTPS для всего. Например, Paypal всегда использует HTTPS даже для обычных статических страниц.