Posso leggere la parte hash dell'URL sulla mia applicazione lato server (PHP, Ruby, Python, ecc.)?


217

Supponendo un URL di:

www.example.com/?val=1#part2

PHP può leggere le variabili di richiesta val1usando l'array GET.

È possibile part2leggere anche il valore hash ? O è solo fino al browser e JavaScript?

Risposte:


203

Il problema principale è che il browser non invierà nemmeno una richiesta con una parte frammentata. La parte del frammento viene risolta proprio lì nel browser. Quindi è raggiungibile tramite JavaScript.

Ad ogni modo, potresti analizzare un URL in bit, inclusa la parte del frammento, usando parse_url () , ma ovviamente non è il tuo caso.


98

Test semplice, accedendo a http: // localhost: 8000 / hello? Foo = bar # this-is-not-sent-to-server

python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"
Serving HTTP on 0.0.0.0 port 8000 ...
localhost - - [02/Jun/2009 12:48:47] code 404, message File not found
localhost - - [02/Jun/2009 12:48:47] "GET /hello?foo=bar HTTP/1.1" 404 -

Il server riceve la richiesta senza #appendage - qualsiasi cosa dopo il tag hash è semplicemente una ricerca di ancoraggio sul client.

Puoi trovare il nome di ancoraggio utilizzato all'interno dell'URL tramite javascript usando, ad esempio:

<script>alert(window.location.hash);</script>

La funzione parse_url () in PHP può funzionare se hai già la stringa URL necessaria incluso il frammento ( http://codepad.org/BDqjtXix ):

<?
echo parse_url("http://foo?bar#fizzbuzz",PHP_URL_FRAGMENT);
?>

Output: fizzbuzz

Ma non credo che PHP riceva le informazioni sui frammenti perché sono solo client.


48

È recuperabile da Javascript - come window.location.hash. Da lì è possibile inviarlo al server con Ajax, ad esempio, oppure codificarlo e inserirlo in URL che possono quindi essere passati al lato server.


1
Grazie! Per essere chiari, invece di questo: www.example.com/?val=1#part2 dovresti reindirizzare su di esso sul server, in questo modo: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 e ovviamente dovresti aggiungere supporto per reindirizzare a quell'altro URL nell'altra pagina. Non eccezionale, e ovviamente non funziona per tutti i casi d'uso, ma funziona anche per i segnalibri. Tieni presente che se lo fai, non dovresti consentire i reindirizzamenti agli URL assoluti, solo gli URL relativi, per assicurarti di non aprirti a reindirizzamenti non sicuri
Brad Parks


8

Sì, è vero, il server non ottiene la parte di ancoraggio. Tuttavia, esiste una soluzione alternativa utilizzando i cookie. Puoi trovarlo qui: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
Questa "soluzione alternativa" è inutile. Ci sono una dozzina di tecniche migliori se sei d'accordo con 2 richieste per visualizzazione di pagina.
umassthrower,

11
Come è inutile? Questo sicuramente non ha valore. Ma forse ci sono tecniche migliori.
Kishor,

Quali sono le tecniche migliori? Per il mio google oauth, lo reindirizzo alla mia pagina API con l'hash di token di accesso, quindi eseguo un "ajax inception" in cui eseguo il rendering di uno script ajax rapido che ajax la stessa pagina ma con il valore hash questa volta come parametro di richiesta . Sembra strano ... ci sono probabilmente modi migliori, ma tutti i modi che ho visto sembrano confusi
confusi Gisheri,

7

La risposta è no.

Lo scopo principale dell'hash è scorrere fino a una determinata parte della pagina in cui è stato definito un segnalibro. ad es. Scorrere fino a questa parte quando la pagina viene caricata.

La navigazione scorrerà in modo tale che questa riga sia il primo contenuto visibile nella pagina, a seconda di quanto segue segue la riga.

Sì, JavaScript può accedervi, e quindi una semplice chiamata Ajax farà la magia


4

Che dire:

Prendi dinamicamente il #hash

<script>
var urlhash = window.location.hash, //get the hash from url
    txthash = urlhash.replace("#", ""); //remove the #
    //alert(txthash);
</script>

<?php
$hash = "<script>document.writeln(txthash);</script>";
echo $hash;
?>

Per renderlo più fluido:

Esempio completo usando solo Javascript e PHP

<script>
var urlhash = window.location.hash,  //get the hash from url
txthash = urlhash.replace("#", "");  //remove the #

function changehash(a,b){
   window.location.hash = b; //add hash to url
   //alert(b); //alert to test
   location.reload(); //reload page to show the current hash
}
</script>

<?php $hash = "<script>document.writeln(txthash);</script>";?>

<a onclick="changehash(this,'#hash1')" style="text-decoration: underline;cursor: pointer;" >Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')" style="text-decoration: underline;cursor: pointer;">Change to #hash2</a><br/> 

<?php echo "This is the current hash: " . $hash; ?> 

PHP non ottiene ancora il valore hash.
Cornernote,

soluzione dolce e breve.
Waruna Manjula,

3

Penso che il valore hash sia usato solo dal lato client, quindi non puoi ottenerlo con php.

potresti reindirizzarlo con javascript a php però.


1
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>

Questo dovrebbe funzionare


Se hai l'URL come stringa è facile, anche se lo analizzi con reg exp. Il problema è che non puoi accedere a # photo45 dal server (usa phpinfo () e non vedrai # photo45 da nessuna parte
Nik Chankov


1

Si, puoi:

Utilizzare questo metodo per prevenire errori:

<script> 
query=location.hash;
document.cookie= 'anchor'+query;
</script>

E ovviamente in PHP, esplodi quel cucciolo e ottieni uno dei valori

$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag

0

Un'altra soluzione è aggiungere un campo di input nascosto alla pagina php:

<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">

Utilizzando javascript / jQuery è possibile impostare il valore di questo campo sul caricamento della pagina o rispondere a un evento:

$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));

In php sul lato server puoi leggere questo valore usando la raccolta $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Possiamo farlo anche con un altro approccio, come prima cosa ottenere il valore hash da js e chiamare ajax usando quel parametro e possiamo fare quello che vogliamo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.