Deteccion de redireccion con php

suaveSHOW

Hola, estoy otra vez con mis dudas jej, estoy seguro de que es sencillo pero he probado lo que se me ha ocurrido y nada.
Estoy haciendo un script php para practirar y tengo esta funcion que te detecta y muestra la pagina a la que es redireccionada la introducida.

function checkredir($url) {
$da=fopen($url, 'r');
$meta_datos=stream_get_meta_data($da);
foreach($meta_datos['wrapper_data'] as $respuesta)
{
  if (substr(strtolower($respuesta), 0, 10) == 'location: ')
  {
	$starturl=$url;
	$finalurl=substr($respuesta, 10);
	return $finalurl;
  }

}  
} echo checkredir('$url_de_ejemplo');

Ahora pongo dos posibilidades:
Si defino $url_de_ejemplo como http://url.com/hola.php?id=2 y esta redirecciona a http://url.com/2.php pues me muestra http://url.com/2.php.

La otra opcion posible es que se quede como esta, por ejempo http://url.com/2.php, que me muestra nada.

Pues quiero que la funcion compruebe si redirecciona, y si no, te devuelva la inicial, por loq ue probe dejarlo asi

function checkredir($url) {
$da=fopen($url, 'r');
$meta_datos=stream_get_meta_data($da);
foreach($meta_datos['wrapper_data'] as $respuesta)
{
  if (substr(strtolower($respuesta), 0, 10) == 'location: ')
  {
	$starturl=$url;
	$finalurl=substr($respuesta, 10);
	if($starturl!=$finalurl)
		return $finalurl
	else
		return $starturl;
  }

}  
} echo checkredir('$url_de_ejemplo');

Pero si no redirecciona no me muestra nada, espero haberme explicado bien.

LOc0

Salu2 ;)

PD: hazte un GRAN favor y aprende a usar las REGEX http://es.php.net/manual/es/book.pcre.php

suaveSHOW

No se si lo has probado, pero no te sale a donde redirecciona, solo la inicial.
Gracias de todos modos.

EDIT:
He probado con una cosa y ya funciona, se que puede ser una chapuza pero me vale, probare si puedo "fusionarlo" en una y ya esta.

Dejo el codigo como en #1 el primer codigo que he puesto, y lo que hago es hacer otra funcion muy sencilla.

function checknoredir($checked, $nochecked) {
	if($checked=='')
	echo $nochecked;
else
	echo $checked;
}

Y bueno, me funciona y con eso me vale :D

Si alguien tiene otra opción mejor, seguirisimo, la aceptare con gusto :)

LOc0

Hola de nuevo. Perdona pero no había usado nunca stream_get_meta_data(). Mira a ver así:

function checkredir($url)
{
	$da=fopen($url, 'r');
	
$metadatos=stream_get_meta_data($da);

$encontrado=FALSE;

while(($respuesta=each($metadatos['wrapper_data'])) && !$encontrado)
	if(preg_match('/Location\: *?(.+)/i', $respuesta[1], $finalurl))
		$encontrado=TRUE;

if(!$encontrado)
	$finalurl=$url;
else
	$finalurl=$finalurl[1];
	
return $finalurl;
}

He intentado ponerte el código lo más claro posible, pero si no sabes de REGEX el preg_match() no creo que lo pilles del todo...

Salu2 ;)

Fr4nk0

Ya por curiosidad, puedes poner un ejemplo del archivo que abres? porque cuando hablas de saca rla página a la que te redirecciona, el archivo que abres es tb un php, donde hay un header con Location... no? o estas hablando de redireccion con javascript (Window.location.... ). Pq si es un php si es normal q solo haya un header con Location (o un meta con refresh y location), pero si hablamos de javascript, podria haber muchas redirecciones, no se si me has entendido.

PD: Sólo es por curiosidad , para saber el tipo de archivo sobre el que aplicas eso.

suaveSHOW

Pues queria aplicarlo para esto:
http://steamcommunity.com/profiles/76561197976554568/
esta redirecciona a:
http://steamcommunity.com/id/ifuckmyself/

erdanblo

Pienso que cosas así es mejor hacerla a través de .htaccess

Beavis

Usar expresiones regulares cuando se puede usar una búsqueda de cadena normal y corriente es un error ya que lo único que nos va a suponer es que consumamos más recursos y tiempo de ejecución.
Las expresiones regulares son muy potentes pero debes evitarlas si no son realmente necesarias.

<?php
$url = 'http://steamcommunity.com/profiles/76561197976554568/';
if (!($fp = @fopen($url, 'r'))) {
	die('No puedo abrir '.$url);
}
$metadata  = stream_get_meta_data($fp);
$redir = false;
for ($i = 0; isset($metadata['wrapper_data'][$i]) && !$redir; $i++) {
   if (strstr(strtolower($metadata['wrapper_data'][$i]), 'location')) {
      $redir = substr($metadata['wrapper_data'][$i], 10);	
   }
}
fclose($fp);
$output = ($redir) ? $redir : $url;
echo $output;
?>
LOc0

#8

Por supuesto. Si estás 100% seguro de ese DIEZ puedes pasar de la regex en este ejemplo (ó quedarte con la salida de strstr() y leer desde los ':' de "location:" hacia delante y después cargarte cualquier espacio sobrante con trim()). Cuando hay que buscar a "ciegas" las regex son el mejor aliado y la penalización en rendimiento (que habria que estudiar bastante más despacio porque es una cuestión a bajo nivel que depende de la plataforma y de cómo se "compilen" las expresiones) casi siempre compensa.

Salu2 ;)

Usuarios habituales

  • LOc0
  • Beavis
  • erdanblo
  • suaveSHOW
  • Fr4nk0