2012-06-09 8 views
5

Qui ho un bel dilemma e vorrei ricevere alcuni suggerimenti dalla comunità. Ecco il mio problema:Identificatore frammento di elaborazione PHP nell'URL

Ho creato un sito Web con molti contenuti dinamici, tutti i contenuti vengono estratti tramite AJAX e visualizzati tramite JS. Il modo in cui sto attualmente consente collegamenti diretti per il mio contenuto è modificando l'identificatore di frammento al volo con JS, ecco un esempio:

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

dove 123 è l'ID del contenuto. Quando il contenuto è chiuso, rimuove nuovamente l'identificatore di frammento.

Questo funziona meravigliosamente, e quando le persone caricano la pagina la mia richiesta AJAX sta richiedendo con successo l'articolo "123". Ma ho appena implementato un pulsante simile a Facebook su tutti gli articoli, e ora ho colpito un muro di mattoni.

Fondamentalmente, il modo in cui Facebook trova l'anteprima, i titoli e l'URL da associare al contenuto "piaciuto" è quello di controllare i meta tag dell'URL trasmessi in fb come iframe. Lo fa facendo una richiesta GET all'URL, controllando il contenuto dei meta tag e quindi visualizzandoli su Facebook.

Il problema è che gli identificatori di frammenti non vengono passati al server, quindi non ho modo in PHP (che io sappia) di generare dinamicamente questi meta tag con il contenuto dell'articolo specificamente richiesto.

Per esempio, ho voluto essere in grado di fare qualcosa del genere:

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

Il tuo primo pensiero è probabilmente: Perché non utilizzare una richiesta GET o stringa di query? cioè .:

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

Tuttavia, il problema di questo approccio è che Javascript non può cambiare dinamicamente questa porzione di un URL, è possibile modificare solo l'identificatore di frammento. Ciò significa che tutti i link diretti ai nostri articoli richiederanno l'aggiornamento della pagina. Questo va contro il nostro intero approccio 'dinamico', che potrei aggiungere è davvero bello :)

Quindi sono un po 'perplesso al momento. L'unica semi-soluzione che posso pensare è di utilizzare un approccio di entrambi:

Nelle richieste fb, utilizzare i parametri get e per i collegamenti diretti utilizzare l'identificatore di frammento.

Ma questo pone i seguenti problemi:

  • Se un collegamento diretto viene incollato su Facebook da un utente che includerà l'identificatore di frammento, e meta-dati corretti non verranno visualizzati su Facebook.
  • Avrei bisogno di fare qualche strana magia di reindirizzamento per correggere il formato dell'URL per rimuovere l'ID (ad esempio, rilevare se il parametro GET è passato e reindirizzare all'identificatore del frammento equivalente). Ma non so se l'FB seguirà anche il reindirizzamento e recupererà i meta tag dalla pagina reindirizzata anziché dalla prima pagina, il che renderebbe comunque questa soluzione inutile.

Ci scusiamo per il muro di testo! Apprezzo ogni input che puoi fornire.

EDIT: Ho appena testato la mia soluzione proposta che coinvolge una combinazione di entrambi, e posso confermare Facebook segue il reindirizzamento, quindi questa soluzione non funziona affatto. Questo è deprimente!

edit Un possibile modo per implementare la mia idea 'mix' è quello di utilizzare un window.location reindirizzare invece di una chiamata di reindirizzamento intestazione PHP(), in modo da Facebook recupera i meta tag dalla pagina originale, per chi di te con un problema simile.

Grazie. Funzione

+0

Perché il Javascript non può modificare i parametri GET dell'URL? –

+1

Vorrei che tutti i nuovi poster su SO mostrassero la quantità di sforzi e ricerche che hai mostrato ... – jprofitt

+1

Cheers jprofitt! Scott: I parametri GET non sono modificabili da JavaScript senza causare un reindirizzamento. Window.location tratta gli identificatori di frammenti e interroga le stringhe in modo diverso. – scrapii

risposta

0

di PHP parse_url ritorna tutto compreso il frammento hash, così da poter utilizzare sia parse_url e accedere alla chiave fragment della matrice restituita

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

o in alternativa passaggio nell'area di component bandierina PHP_URL_FRAGMENT, e solo recuperare il frammento si

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

Probabilmente i frammenti non vengono inviati dal client al server attraverso i fili. Questo parsing PHP è utile solo per la manipolazione degli URL del server interno, no? – DragonLord

3

Se è possibile rejigger tuo sito per utilizzare hashbang #! URL, Facebook supporta un po 'in silenzio Google's AJAX crawling spec.

Su incontrando un URL contenente #!, si convertirà automaticamente questo e il seguente testo alla stringa di query GET-friendly ?_escaped_fragment_=. Il tuo codice lato server può escludere il parametro GET, se presente.

2

index.php semplicemente fa eco alla sessione ['refer'] e quando viene aggiornata da Navigasyon.js l'id aggiunge un/kill alla fine del frammento in cui si inserisce per interrompere il processo di aggiornamento in loop!

<?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 tutta la magia succede qui! semplicemente invia il frammento via ajax a navg.php e lo registra in una sessione e risponde allo stesso frammento dal server quando si accerta di uccidere il ciclo di aggiornamento indice php aggiunge un/kill frag e si ferma

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 che dici che sta succedendo in questa parte!

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