Puis-je lire la partie de hachage de l'URL sur mon application côté serveur (PHP, Ruby, Python, etc.)?


217

En supposant une URL de:

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

PHP peut lire les variables de requête en val1utilisant le tableau GET.

La valeur de hachage est-elle part2également lisible? Ou est-ce uniquement dans le navigateur et JavaScript?

Réponses:


203

Le principal problème est que le navigateur n'enverra même pas de demande avec une partie fragmentée. La partie fragment est résolue directement dans le navigateur. Il est donc accessible via JavaScript.

Quoi qu'il en soit, vous pouvez analyser une URL en bits, y compris la partie fragment, en utilisant parse_url () , mais ce n'est évidemment pas votre cas.


98

Test simple, accès à 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 -

Le serveur reçoit la demande sans #appendage - tout ce qui se trouve après la balise de hachage est simplement une recherche d'ancrage sur le client.

Vous pouvez trouver le nom de l'ancre utilisé dans l'URL via javascript en utilisant, par exemple:

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

La fonction parse_url () en PHP peut fonctionner si vous avez déjà la chaîne URL nécessaire, y compris le fragment ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Mais je ne pense pas que PHP reçoive les informations sur les fragments car elles sont réservées au client.


48

Il est récupérable à partir de Javascript - as window.location.hash. De là, vous pouvez l'envoyer au serveur avec Ajax par exemple, ou le coder et le mettre dans des URL qui peuvent ensuite être transmises au serveur.


1
Merci! Donc, pour être clair, au lieu de cela: www.example.com/?val=1#part2 vous devrez rediriger vers celui-ci sur le serveur, comme ceci: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 et bien sûr, vous devrez ajouter du support pour rediriger vers cette autre URL dans votre autre page. Pas génial, et ne fonctionne pas pour tous les cas d'utilisation bien sûr, mais fonctionne pour les signets. Notez que si vous faites cela, vous ne devez pas autoriser les redirections vers des URL absolues, uniquement des URL relatives, pour vous assurer de ne pas vous ouvrir à des redirections dangereuses
Brad Parks


8

Oui c'est vrai, le serveur ne reçoit pas la partie d'ancrage. Cependant, il existe une solution de contournement en utilisant des cookies. Vous pouvez le trouver ici: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
Cette "solution de contournement" est sans valeur. Il existe une douzaine de meilleures techniques si vous êtes d'accord avec 2 demandes par affichage de page.
umassthrower

11
Comment ça ne vaut rien? Ce n'est certainement pas sans valeur. Mais il y a peut-être de meilleures techniques.
Kishor

Quelles sont les meilleures techniques? Pour mon google oauth, je le redirige vers ma page d'api avec le hachage de jeton d'accès, puis je fais une "création ajax" où je rend un script ajax rapide qui ajaxe la même page mais avec la valeur de hachage cette fois comme paramètre de demande . Cela semble bizarre .. il y a probablement de meilleures façons, mais toutes les façons que j'ai vues semblent
bizarres

7

La réponse est non.

Le but principal du hachage est de faire défiler jusqu'à une certaine partie de la page où vous avez défini un signet. Par exemple, faites défiler jusqu'à cette partie lorsque la page se charge.

La navigation défilera de manière à ce que cette ligne soit le premier contenu visible de la page, selon la quantité de contenu qui suit sous la ligne.

Oui javascript peut y accéder, puis un simple appel ajax fera la magie


4

Qu'en est-il de:

Saisissez dynamiquement le #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;
?>

Pour le rendre plus fluide:

Exemple complet utilisant uniquement Javascript et 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 n'obtient toujours pas la valeur de hachage.
cornernote

solution douce et courte.
Waruna Manjula

3

Je pense que la valeur de hachage n'est utilisée que côté client, donc vous ne pouvez pas l'obtenir avec php.

vous pouvez cependant le rediriger avec javascript vers php.


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

C'est devrait fonctionner


SI vous avez l'url comme chaîne, c'est facile, même si vous l'analysez avec reg exp. Le problème est que vous ne pouvez pas accéder à # photo45 depuis le serveur (utilisez phpinfo () et vous ne verrez # photo45 nulle part
Nik Chankov


1

Oui, vous pouvez:

Utilisez cette méthode pour éviter les erreurs:

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

Et bien sûr en PHP, faites exploser ce chiot et obtenez l'une des valeurs

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

0

Une autre solution consiste à ajouter un champ de saisie masqué à la page php:

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

En utilisant javascript / jQuery, vous pouvez définir la valeur de ce champ lors du chargement de la page ou répondre à un événement:

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

En php côté serveur, vous pouvez lire cette valeur en utilisant la collection $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Nous pouvons le faire avec une autre approche aussi, comme tout d'abord obtenir la valeur de hachage de js et appeler ajax en utilisant ce paramètre et faire ce que nous voulons

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.