2009-06-02 8 views

risposta

180

Il problema principale è che il browser non invia nemmeno una richiesta con una parte di frammento. La parte del frammento è stata risolta proprio nel browser. Quindi è raggiungibile tramite JavaScript.

In ogni caso, è possibile analizzare un URL in bit, compresa la parte del frammento, utilizzando parse_url(), ma ovviamente non è il tuo caso.

4

Penso che il valore hash sia utilizzato solo lato client, quindi non è possibile farlo con php.

si potrebbe reindirizzare con javascript a php però.

48

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

+0

Grazie! Quindi, per essere chiari, invece di questo: 'www.example.com/? Val = 1 # part2' Dovresti reindirizzare ad esso sul server, in questo modo: ' www.example.com/? redirectUrl =% 2F% 3Fval% 3D1% 23part2' e ovviamente dovresti aggiungere il supporto per reindirizzare a quell'altro url nella tua altra pagina. Non eccezionale, e naturalmente non funziona per tutti i casi d'uso, ma funziona con i segnalibri. Nota che se lo fai, non dovresti consentire reindirizzamenti a url assoluti, solo url relativi, per assicurarti di non aprirti a [reindirizzamenti non sicuri] (https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet) –

94

prova semplice, accedendo 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 l'#appendage - nulla dopo il tag hash è semplicemente una ricerca di ancoraggio sul client.

È possibile trovare il nome di ancoraggio utilizzato all'interno dell'URL tramite JavaScript utilizzando, ad esempio:

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

La funzione parse_url() in PHP può funzionare se si dispone già la stringa URL necessari tra cui il frammento (http://codepad.org/BDqjtXix):

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

Output: fizzbuzz 

Ma non credo che PHP riceve le informazioni frammento, perché è solo client.

7

La risposta è no.

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

Il browse scorrerà in modo tale che questa riga sia il primo contenuto visibile nella pagina, a seconda di quanto segue il contenuto sotto la linea.

Sì JavaScript può acces, e poi una semplice chiamata Ajax farà la magia

8

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

+2

Questa "soluzione alternativa" è senza valore. Ci sono una dozzina di tecniche migliori se stai bene con 2 richieste per visualizzazione di pagina. – umassthrower

+10

Com'è inutile? Questo sicuramente non è senza valore. Ma forse ci sono tecniche migliori. Va bene. – Kishor

+1

Dannazione dell'hacky. Sono d'accordo con @umassthrower. –

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

Questo si dovrebbe funzionare

+0

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 ovunque –

1

Sì, è possibile:

Utilizzare questo metodo per evitare errori:

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

E naturalmente in PHP, esplodere quel cucciolo e ottenere 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 
-1

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

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

Utilizzo di 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 si può leggere questo valore utilizzando la raccolta $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash']; 
Problemi correlati