2012-06-09 13 views
5

Tengo un gran dilema aquí y me gustaría recibir algunas sugerencias de la comunidad. Aquí está mi problema:Identificador de fragmento de procesamiento de PHP en URL

He creado un sitio web que tiene un montón de contenido dinámico, todo el contenido se extrae a través de AJAX y se muestra a través de JS. La forma en que actualmente estoy permitiendo enlaces directos a mi contenido es mediante la modificación del identificador de fragmento sobre la marcha con JS, he aquí un ejemplo:

http://www.mysite.com/home#/123

Donde 123 es el identificador del contenido. Cuando el contenido se cierra, quita el identificador de fragmento nuevamente.

Esto funciona maravillosamente, y cuando la gente carga la página, mi solicitud AJAX está solicitando con éxito el artículo '123'. Pero acabo de implementar un botón similar a Facebook en todos los artículos, y ahora me he topado con un muro de ladrillos.

Básicamente, la manera en que Facebook encuentra qué miniatura y títulos y URL asociar con su contenido 'me gusta' es comprobar las metaetiquetas de la URL pasada al fb como iframe. Lo hace haciendo una solicitud GET en la URL, verificando el contenido de las metaetiquetas y luego exhibiéndolas en Facebook.

El problema es que los identificadores de fragmentos no se pasan al servidor, por lo que no tengo manera en PHP (que yo sepa) de generar dinámicamente estas metaetiquetas con el contenido del artículo solicitado específicamente.

Por ejemplo, yo quería ser capaz de hacer algo como esto:

$id_vals = get_id_values($hash_fragment); 
echo '<meta property="og:title" content="'.$id_vals['title'].'" />'; 

Su primer pensamiento es probablemente: ¿Por qué no utilizar una solicitud GET o cadena de consulta? es decir .:

http://www.mysite.com/home?id=123

Sin embargo, el problema con este enfoque es que Javascript no puede cambiar dinámicamente esta porción de un URL, sólo se puede cambiar el identificador de fragmento. Esto significa que todos los enlaces directos a nuestros artículos requerirán actualizaciones de página. Esto va en contra de todo nuestro enfoque 'dinámico' que tenemos en marcha, lo que podría agregar es realmente bueno :)

Así que estoy un poco perplejo en este momento. La única semi-solución que puedo pensar es usar un enfoque de ambos:

En las solicitudes de tipo fb, utilice los parámetros de obtención y para los enlaces directos utilice el identificador de fragmento.

Pero esto plantea los siguientes problemas:

  • Si un enlace directo se pega en Facebook de un usuario que incluirá el identificador de fragmento, y los metadatos correctos no se mostrará en Facebook.
  • Tendría que hacer alguna magia de redirección extraña para arreglar el formato de la URL para eliminar la ID (es decir, detectar si se pasa el parámetro GET y redirigir al identificador de fragmento equivalente). Pero no sé si FB también seguiría la redirección y buscaría las metaetiquetas de la página redirigida en lugar de la primera, lo que efectivamente haría que esta solución fuera inútil de todos modos.

¡Perdón por el muro de texto! Apreciar cualquier entrada que pueda proporcionar.

EDIT: Acabo de probar mi solución propuesta que implica una combinación de ambos, y puedo confirmar que Facebook sigue el redireccionamiento, por lo que esta solución no funciona en absoluto. Esto es deprimente!

EDITAR EDITAR: Una posible manera de poner en práctica mi idea 'mezcla' es utilizar un window.location redirigir en lugar de una redirección de llamadas cabecera de PHP(), por lo que Facebook obtiene los meta tags de la página original, para aquellos de ti con un problema similar.

Gracias. función

+0

¿Por qué el Javascript no puede cambiar los parámetros de GET de la URL? –

+1

Deseo que todos los nuevos pósters en SO puedan mostrar la cantidad de esfuerzo e investigación que ha demostrado ... – jprofitt

+1

¡Salud, jprofitt! Scott: Los parámetros GET no son modificables por JavaScript sin causar un redireccionamiento. Window.location trata los identificadores de fragmentos y las cadenas de consulta de forma diferente. – scrapii

Respuesta

0

de PHP parse_url devuelve todo, incluyendo el fragmento de hachís, por lo que podría o bien utilizar parse_url y acceder a la clave fragment de la matriz devuelta

$url = 'http://www.mysite.com/home#/123'; 
$parts = parse_url($url); 
$fragment = $parts['fragment']; // => '/123' 

o alternativamente pase en el component bandera PHP_URL_FRAGMENT, y acaba de recuperar el fragmento sí

$fragment = parse_url($url, PHP_URL_FRAGMENT); // => '/123' 
+0

Probablemente los fragmentos no se envían del cliente al servidor a través de los cables. Este análisis de PHP solo es útil para la manipulación de URL del servidor interno, ¿no? – DragonLord

3

Si puede rejigger su sitio para utilizar Hashbang #! URL, Facebook apoya tanto en silencio Google's AJAX crawling spec.

Al encontrar una URL que contiene #!, convertirá automáticamente ese y el siguiente texto en la cadena de consulta ?_escaped_fragment_=. El código del lado del servidor puede desactivar ese parámetro GET, si está presente.

2

index.php simplemente se hace eco de la sesión ['refer'] y cuando se actualiza mediante Navigasyon.js id agrega un/kill al final del fragmento que ingresa para detener el proceso de refresco en bucle!

<?php session_start(); ?> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Boom - test</title> 
     <script type="text/javascript" src="js/jquery.js"></script> 
     <script type="text/javascript" src="js/Navigasyon.js"></script> 
    </head> 
    <body onLoad="if (location.href.indexOf('/kill')==-1) location.replace(location.href+'/kill')"> 
     <?php 
//echo $_GET['url']; 
//echo parse_url(); 
//echo $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"].$_SERVER['PHP_SELF'];; 
     if (isset($_SESSION['refer'])) 
      echo $_SESSION['refer']; 
     ?> 
    </body> 
</html> 

Navigasyon.php toda la magia sucede aquí! simplemente envía el fragmento por ajax a navg.php y lo registra en una sesión y responde el mismo fragmento del servidor cuando se asegura de matar el índice de bucle de actualización php agrega un/kill frag y detiene

var whereAmI = window.location.hash; 
var prsdUrl = window.location.hash.split("/"); 
var a = 0; //#! 
var b = 1; //Sayfa dil 
var c = 2; //Sayfa id 

if(prsdUrl[a] == "#!") 
{ 
    $.post("navg.php", { 
     refer: whereAmI 
    }, 
    function(data) { 
     //if(data='ref') document.location.reload(); 
     if(data==whereAmI) { 
      if(prsdUrl[c] != 'kill') { 
       document.location.reload(); 
      } 
     } 
    }); 
} 

navg.php le dices qué está pasando en esta parte!

<?php 
session_start(); 
$_SESSION['refer'] = $_POST['refer']; ?> 
<?php echo $_SESSION['refer']; 
?> 
Cuestiones relacionadas