Перенаправление PHP после ПУБЛИКАЦИИ

#php #post #redirect #google-signin

Вопрос:

Я работаю с системой входа в Google и в основном нахожусь там. Пользователь успешно входит в систему, и я могу получить доступ к своей таблице пользователей mysql, чтобы просмотреть запись пользователя. После того, как я завершил обработку пользователей и установил переменные $_SESSION, я хочу перенаправить со страницы ПУБЛИКАЦИИ обратно на свою index.php страница. Я знаю, что страница ПУБЛИКАЦИИ выполняется, но перенаправление не работает, и я не вижу никаких ошибок (например, «Невозможно изменить информацию о заголовке — заголовки уже отправлены».

login.php содержит кнопку входа в Google и вызывает функцию js в includes/oauth.js

 ...  lt;script src="https://apis.google.com/js/platform.js" async defergt;lt;/scriptgt;  lt;script src="includes/oauth.js"gt;lt;/scriptgt; lt;/headgt; lt;bodygt;  lt;div id="content"gt;  lt;div class="g-signin2" data-longtitle="true" data-onsuccess="onSignIn"gt;lt;/divgt; ...  

Функция onSignIn выполняет процесс входа в систему и извлекает данные пользователя. Он также подготавливает последующий вызов, включая маркер аутентификации

 ...  var xhr = new XMLHttpRequest();  xhr.open('POST', 'includes/oauth.php');  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  xhr.send('idtoken='   id_token); ...  

В includes/oauth.php файл принимает токен, проверяет его. Получает идентификатор пользователя, просматривает его в моей базе данных и подготавливает переменные сеанса. На этом этапе он должен перенаправить, но этого не происходит. Я в тупике. Связано ли это с тем, что я использую XMLHttpRequest() для ПУБЛИКАЦИИ?

 lt;?php session_start(); ... if (isset($_POST['idtoken'])){ ...  $_SESSION["auth"] = true;  $_SESSION["userId"] = $row['id'];  $_SESSION["userName"] = $row['name'];  header("Location: ../index.php");  exit(); } ...  

Комментарии:

1. Поскольку вы используете AJAX, перенаправление просто возвращает содержимое index.php как xhr.responseText , оно не заставляет браузер открывать URL-адрес.

2. Браузер сам открывает новый URL-адрес только при перенаправлении после отправки формы.

3. Я думал, что это может быть как-то связано с xhr, и на самом деле я заметил содержимое веб-страницы в xhr.ответе. Текст во время отладки.

4. Какие у меня есть варианты для фактического выполнения перенаправления?

5. В xhr.onreadystatechange функции используйте window.location = "../index.php"

Ответ №1:

Возможно, страница продолжает загружаться/обрабатываться и не заканчивается? Я работал над аналогичной проблемой, связанной с файлами cookie/сообщениями, и это может быть аналогичное решение. В моем случае мне пришлось использовать cookie_write_close() , потому что я установил бы файлы cookie, которые зависели бы от текущего session_start() контекста. Перед добавлением cookie_write_close() процесс php останется открытым, и загрузка перенаправления не произойдет. Вместо этого время ожидания страницы будет зависеть от настроек тайм-аута сервера.

Ответ №2:

Я обновил includes/oauth.js файл выглядит следующим образом:

 var xhr = new XMLHttpRequest();  xhr.open('POST', 'includes/oauth.php');  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  xhr.onreadystatechange = function() {  window.location = "../index.php";  xhr.send('idtoken='   id_token);  

Теперь все работает нормально!