php - otra - redireccionar una pagina web a otro dominio
Persecución de PHP perdida después de redirigir (26)
¿Cómo resuelvo el problema de perder una sesión después de una redirección en PHP?
Recientemente, me encontré con un problema muy común de pérdida de sesión después de la redirección. Y después de buscar a través de este sitio web todavía no puedo encontrar una solución (aunque this fue la más cercana).
Actualizar
Encontré la respuesta y pensé que la publicaría aquí para ayudar a cualquiera que tenga el mismo problema.
Ahora que GDPR es una cosa, las personas que visitan esta pregunta probablemente utilicen un script de cookies. Bueno, ese guión me causó el problema. Aparentemente, PHP usa una cookie llamada PHPSESSID
para rastrear la sesión. Si ese script lo elimina, perderá sus datos.
Usé este script de cookies . Tiene una opción para habilitar las cookies "esenciales". PHPSESSID
a la lista, el script dejó de eliminar la cookie y todo comenzó a funcionar nuevamente.
Probablemente PHPSESSID
habilitar alguna configuración de PHP para evitar el uso de PHPSESSID
, pero si tu script de cookies es la causa del problema, ¿por qué no corregirlo?
Asegúrese de crear correctamente una nueva sesión destruyendo primero la sesión anterior.
session_start();
// remove all session variables
session_unset();
// destroy the session
session_destroy();
session_start();
$_SESSION[''username''] = ''username'';
Sí, session_start () se llama dos veces. Una vez para llamar a los comandos desarmar y destruir y una segunda vez para comenzar una nueva sesión.
Asegúrese de que session_write_close
no se llame entre session_start()
y cuando configura su sesión.
session_start();
[...]
session_write_close();
[...]
$_SESSION[''name'']=''Bob''; //<-- won''t save
Después de probar muchas soluciones aquí en SO y otros blogs ... lo que funcionó para mí fue agregar .htaccess a la raíz de mi sitio web.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http/:////www/.yoursitename/.com" [R=301,L]
En primer lugar, asegúrese de estar llamando a session_start()
antes de usar la variable $_SESSION
.
Si ha desactivado el informe de errores, intente activarlo y ver el resultado.
ini_set(''display_errors'', 1);
ini_set(''display_startup_errors'', 1);
error_reporting(E_ALL);
Las razones más comunes que no se mencionan en la respuesta de @ dayuloli:
Problema de espacio en el disco Asegúrese de que el espacio en disco no esté lleno, necesita espacio para almacenar los archivos de sesión.
El directorio de sesión puede no ser editable. Puede verificarlo con
is_writable(session_save_path())
Estaba teniendo el mismo problema y me volví loco buscando en mi código la respuesta. Finalmente encontré que mi hosting actualizó recientemente la versión de PHP en mi servidor y no configuró correctamente el parámetro session_save_path
en el archivo php.ini
.
Por lo tanto, si alguien lee esto, compruebe la configuración de php.ini
antes que nada.
Estaba teniendo el mismo problema. De repente, ALGUNAS de mis variables de sesión no persistirían en la página siguiente. El problema resultó ser (en php7.1) la ubicación del encabezado no debe tener WWW en él, ex https: // mysite . está bien, https: //www.misitio . perderá esas páginas de las variables de sesión. No todo, solo esa página.
Esto me dejó perplejo durante mucho tiempo (¡y esta publicación fue genial de encontrar!) Pero para cualquier otra persona que todavía no puede conseguir que las sesiones entre redireccionamientos de página funcionen ... tuve que ingresar al archivo php.ini y activar las cookies :
session.use_cookies = 1
Pensé que las sesiones funcionaban sin cookies ... de hecho, sé que DEBERÍAN ... pero esto solucionó mi problema, al menos, hasta que pueda comprender lo que puede estar sucediendo en el panorama general.
He estado luchando con esto durante días, comprobando / probando todas las soluciones, pero mi problema fue que no llamé a session_start();
de nuevo después de la redirección. Simplemente asumí que la sesión estaba "todavía viva".
¡Así que no lo olvides!
Intenté todas las soluciones posibles, ¡pero ninguna me funcionó! Por supuesto, estoy usando un servicio de alojamiento compartido.
¡Al final, resolví el problema usando la ''URL relativa'' dentro del encabezado de redirección!
header("location: http://example.com/index.php")
anuló las cookies de sesión
header("location: index.php")
trabajado como un encanto !
Me encontré con este problema en una página en particular. Estaba configurando los valores de $ _SESSION en otras páginas justo antes de redireccionar y todo funcionaba bien. Pero esta página en particular no estaba funcionando.
Finalmente me di cuenta de que en esta página en particular, estaba destruyendo la sesión al comienzo de la página pero nunca la volví a iniciar. Entonces mi función de destrucción cambió de:
function sessionKill(){
session_destroy();
}
a:
function sessionKill(){
session_destroy();
session_start();
}
¡Y todo funcionó!
Nada funcionó para mí, pero encontré lo que causó el problema (y lo resolvió):
Verifique las cookies de su navegador y asegúrese de que no haya cookies de sesión php en diferentes subdominios (como uno para " www.website.com " y otro para " website.com ").
Esto fue causado por un javascript que utilizó incorrectamente el subdominio para establecer cookies y abrir páginas en iframes.
Otra posible razón:
Ese es mi espacio de almacenamiento del servidor. El espacio de mi disco de servidor se llena. Por lo tanto, he eliminado algunos archivos y carpetas en mi servidor y lo intenté.
¡Funcionó!
Estoy guardando mi sesión en AWS Dynamo DB, pero todavía espera algo de espacio en mi servidor para procesar la sesión. ¡¡No estoy seguro por qué !!!
Para mí, Firefox ha almacenado ID de sesión (PHPSESSID) en una cookie, pero Google Chrome ha utilizado el parámetro GET o POST. Por lo tanto, solo debe asegurarse de que el script de retorno (para mí: paypal checkout) confirme PHPSESSID en el parámetro url o POST.
Para mí, el error fue que intenté guardar un objeto que no se puede serializar en la sesión para que se lanzara una excepción al intentar escribir la sesión. Pero como todo mi código de manejo de errores ya había dejado de funcionar, nunca vi el error.
Sin embargo, podría encontrarlo en los registros de errores de Apache.
Para que quede constancia ... tuve este problema y después de unas horas de intentarlo todo, el problema era que el disco estaba lleno, y las sesiones de php no podían escribirse en el directorio tmp ... así que si tiene este problema, compruebe que también...
Primero, realice estos controles habituales:
- Asegúrese de que
session_start();
se llama antes de que se convoque cualquier sesión. Entonces, una apuesta segura sería ponerlo al comienzo de su página, inmediatamente después de la apertura de la declaración<?php
antes que cualquier otra cosa. Asegúrese también de que no haya espacios en blanco / pestañas antes de la declaración de apertura de<?php
. - Después del redireccionamiento del
header
, finalice el script actual usandoexit();
(Otros también han sugeridosession_write_close();
ysession_regenerate_id(true)
, puede probarlos también, pero usaréexit();
) - Asegúrese de que las cookies estén habilitadas en el navegador que está utilizando para probarlo.
- Asegúrese de que
register_globals
esté desactivado, puede verificarlo en el archivophp.ini
y también utilizandophpinfo()
. Consulte this sobre cómo apagarlo. - Asegúrate de no eliminar o vaciar la sesión
- Asegúrese de que la clave en su matriz superglobal
$_SESSION
no se sobrescribe en ningún lado - Asegúrate de redirigir al mismo dominio. Por lo tanto, redireccionar desde un sitio
www.yourdomain.com
ayourdomain.com
no lleva adelante la sesión. - Asegúrate de que tu extensión de archivo sea
.php
(¡sucede!)
Ahora bien, estos son los errores más comunes, pero si no lo hicieron, es muy probable que el problema sea con su empresa de hosting. Si todo funciona en el servidor localhost
pero no en el servidor remoto / de prueba, es probable que este sea el culpable. Así que verifique la base de conocimiento de su proveedor de alojamiento (también pruebe sus foros, etc.). Para compañías como FatCow e iPage, requieren que especifique session_save_path
. Así que así:
session_save_path(''"your home directory path"/cgi-bin/tmp'');
session_start();
(reemplace "la ruta de su directorio principal" con la ruta real del directorio de inicio. Por lo general, esto se encuentra dentro de su panel de control (o equivalente), pero también puede crear un archivo test.php
en su directorio raíz y escribir:
<?php echo $_SERVER[''SCRIPT_FILENAME'']; ?>
El bit antes de ''test.php'' es su ruta de directorio de inicio. Y, por supuesto, asegúrese de que la carpeta realmente exista dentro de su directorio raíz. (Algunos programas no cargan carpetas vacías al sincronizar)
Si está usando Wordpress, tuve que agregar este enlace e iniciar la sesión en init:
function register_my_session() {
if (!session_id()) {
session_start();
}
}
add_action(''init'', ''register_my_session'');
Si está utilizando session_set_cookie_params()
, puede verificar si está pasando el cuarto parámetro $secure
como true
. Si es así, entonces necesita acceder a la url usando https.
El parámetro $secure
es verdadero significa que la sesión solo está disponible dentro de una solicitud segura. Esto podría afectarlo localmente más que en entornos de escenario o producción.
Mencionándolo porque acabo de pasar la mayor parte del día tratando de encontrar este problema, y esto es lo que me solucionó. Me acaban de agregar a este proyecto y nadie mencionó que requiriera https.
Entonces puede usar https localmente, o puede configurar $secure
param como FALSE
y luego usar http localmente. Solo asegúrese de volver a establecerlo como verdadero cuando empuje sus cambios hacia arriba.
Dependiendo de su servidor local, es posible que deba editar DocumentRoot
en el httpd-ssl.conf
del servidor para que su url local tenga https.
Si está utilizando Laravel y experimenta este problema, lo que necesita es guardar los datos de su sesión antes de redirigirlos.
session()->save();
// Redirect the user to the authorization URL.
header(''Location: '' . $authorizationUrl);
exit;
También tuve el mismo problema con el redireccionamiento que no funcionaba y probé todas las soluciones que pude encontrar, mi redirección de encabezado estaba siendo utilizada en una forma.
Lo resolví colocando el encabezado redireccionando en una página php diferente ''signin_action.php'' y pasando los parámetros de variables a través de los parámetros de url y luego reasignándolos en el formulario ''signin_action.php''.
signin.php
if($stmt->num_rows>0) {
$_SESSION[''username''] = $_POST[''username''];
echo ''<script>window.location.href = "http://''.$root.''/includes/functions/signin_action.php?username=''.$_SESSION[''username''].''";</script>'';
error_reporting(E_ALL);
signin_action.php
<?php
require(''../../config/init.php'');
$_SESSION[''username''] = $_GET[''username''];
if ($_SESSION[''username'']) {
echo ''<script>window.location.href = "http://''.$root.''/user/index.php";</script>'';
exit();
} else {
echo ''Session not set'';
}
?>
No es una hermosa solución, pero funcionó.
Tuve el mismo problema y encontré la manera más fácil. Simplemente redirigí a un redireccionamiento .html con 1 línea de JS
<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>
en lugar de PHP
header_remove();
header(''Location: admin_login.php'');
die;
Espero que esto ayude.
Love Gram
Tuve un problema similar, aunque mi contexto era ligeramente diferente. Tenía una configuración de desarrollo local en una máquina cuyo nombre de host era windows
y la dirección IP era 192.168.56.2
.
Pude acceder al sistema usando cualquiera de:
Después de iniciar sesión, mi código PHP redirigiría usando:
header(''http://windows/'');
Si el nombre de dominio anterior utilizado para acceder al sistema no era windows
, los datos de la sesión se perderían. Lo resolví cambiando el código a:
header(''http://''.$_SERVER[''HTTP_HOST''].''/'');
Ahora funciona independientemente del nombre de dominio local o la dirección IP que el usuario ingrese.
Espero que esto pueda ser útil para alguien.
Yo tuve el mismo problema. Trabajé en él durante varias horas y eso me volvió loco.
En mi caso, el problema fue un 404 llamado debido a un favicon.ico que falta en Chrome y Firefox solamente. Los otros navegantes funcionaron bien.
debe usar "exit" después de la llamada de encabezado
header(''Location: http://www.example.com/?blabla=blubb'');
exit;
session_start();
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
if(!isset($_SESSION[''name_session''])){
unset($_SESSION[''name_session'']);
session_destroy();
}
if(isset($_SESSION[''name_session''])){
$username = $_SESSION[''name_session''];
}