¿Cómo redirigir subdominios?

Tenemos alojada la página web de la empresa en un servidor compartido con linux, el caso es que queremos redirigir un subdominio a su página de inicio. Por ejemplo cuando alguien teclee subdominio. Dominio.net lo envíe a la página del subdominio que estará alojada en su directorio correspondiente. La empresa que nos aloja la página nos comenta que esto se puede hacer con php. Buscando info he encontrado lo siguiente:
<?php
// Obtenemos la página en la que ha estado antes el visitante
$pagina_anterior = $_SERVER['HTTP_REFERER'];
// De ella extraemos el subdominio mediante una expresión regular
preg_match ('/^http://(www.)?(a-z)+.dominio.com/i', $pagina_anterior, $encontrados);
// Si efectivamente había un subdominio
if ($encontrados[2]) {
// Redireccionamos a www.dominio.com/subdominio/
Header ("Location: http://www.dominio.com/$encontrados[2]/");
exit;
}
?>
El caso es que esto lo he probado y no funciona.
Si podéis echarme una mano con este tema estaré muy agradecido

1 Respuesta

Respuesta
1
Pregunta todo lo que necesites, no te preocupes que no molesta.
En algunos ordenadores no funciona HTTP_REFERER, creo que depende del navegador que uses.
En su lugar prueba a usar lo siguiente:
$pagina_anterior = "{$_SERVER['HTTP_HOST']}";
con eso debería ser suficiente, pero sino prueba con:
$pagina_anterior = "{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}";
Vale me imagina eso, pero el problema creo que reside en la variable:
$_SERVER["HTTP_REFERER"]
Si escribo este código me debería salir la página de la que vengo:
<?php echo $_SERVER["HTTP_REFERER"];?>
y no me sale nada. Sinembargo si pruebo con otra por ejemplo:
<?php echo $_SERVER["HTTP_USER_AGENT"]; ?>
me devuelve:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
lo cual es correcto.
Con phpinfo no me sale esta variable _SERVER["HTTP_REFERER"], ni _ENV["HTTP_REFERER"] .
No se lo que pasa, siento darte tanto el c*ñazo.
Lo he conseguido mediante la variable
_SERVER["SERVER_NAME"], el caso es que funciona aunque no se si es muy ortodoxo.
Un Saludo.
Me sale el siguiente mensaje:
Warning: Unknown modifier '/' in /docroot/index.php on line 5
Linea 5, es esta:
preg_match ('/^http://(www.)?(.+)?.dominio.com/', $pagina_anterior, $encontrados);
Un Saludo.
Vale, por fin, esta vez si que ha funcionado. Esa es la línea correcta.
preg_match('/^http:\/\/(www\.)?(.+)?.dominio.com/',$pagina_anterior,$encontrados);
Perdona, no se lo que ha pasado, lo tenia bien en el código y al copiarlo aquí lo puse mal. La linea correcta es la siguiente:
preg_match ('/^http://(www.)?(.+).dominio.com/', $pagina_anterior, $encontrados);
Perdona el despiste.
Si, es cierto, ¿sabes lo que está ocurriendo? Yo escribo bien el código pero cuando le doy enviar se modifica. Debe ser que este campo de texto en el que escribimos permite escapar caracteres. ¡Curioso!
Bueno, te explico la modificación que hay que hacer. El problema está en "http://" y en "www.", esas dos barras al estar dentro de una expresión regular, php las toma como caracteres especiales, pero no queremos caracteres especiales sino las barras en sí. Para solucionarlo hay que escapar esas barras. Se hace poniendo una barra inversa (\) delante.
Te voy a intentar mandar la misma línea corregida tal cual debe quedar:
preg_match('/^http:\/\/(www\.)?(.+)?.dominio.com/',$pagina_anterior,$encontrados);
Espero que esta vez si funcione. Le he puesto dos barras invertidas en vez de una simple barra invertida. Pero en tu código solo tiene que haber una. Supongo que solo veras una. Que lio, espero que lo hayas entendido.
Ahora que lo pienso, quizá en el código que tu me mandaste ocurrió lo mismo. Comprueba que se corresponde exactamente la línea que tu me mandaste con la que realmente tienes en tu archivo php. Quizá tengas los caracteres de escape, esas barras invertidas. Entonces sólo tendrías que sustituir (a-z)+ por (. +)
No se si me he conseguido explicar correctamente. Con lo fácil que es poner el código tal cual debe quedar.
Me sigue dando el mismo error ¿?
En ese código puedes sustituir las líneas de preg_match y el siguiente if por:
preg_match ('/^http://(www.)?(.+)?.dominio.com/', $pagina_anterior, $encontrados);
if (($encontrados[2]) and ($encontrados[2] != "www")) {
Esto te sirve para direcciones del siguiente tipo:
http://subdominio.dominio.com
http://dominio.com
http://www.dominio.com
http://www.subdominio.dominio.com
http://algo.subdominio.dominio.com
Pruébalo y me comentas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas