web-dev-qa-db-fra.com

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

En supposant une URL de:

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

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

La valeur de hachage part2 est-elle également lisible? Ou est-ce seulement jusqu'au navigateur et à JavaScript?

206
Robinicks

Le problème principal est que le navigateur n'envoie même pas de requête avec une partie fragmentée. La partie fragment est résolue directement dans le navigateur. Donc, il est 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.

192
Ionuț G. Stan

Test simple, accédant à http: // localhost: 8000/hello? Foo = bar # ceci n'est pas envoyé au serveur

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 suit la balise de hachage est simplement une recherche d'ancre sur le client.

Vous pouvez trouver le nom de l'ancre utilisé dans l'URL via JavaScript en utilisant, à titre d'exemple:

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

La fonction parse_url () dans PHP peut fonctionner si vous avez déjà la chaîne d'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 du fragment, car il ne s'agit que du client.

95
tom

Il est récupérable à partir de Javascript - en tant que window.location.hash. À partir de là, vous pouvez l'envoyer au serveur avec Ajax par exemple, ou l'encoder et le placer dans des URL qui peuvent ensuite être transmises au serveur.

48
Alister Bulman

Le hachage n'est jamais envoyé au serveur, donc non.

25
PatrikAkerstrand

Oui c'est vrai, le serveur ne récupère pas la pièce d'ancrage. Cependant, il existe une solution de contournement utilisant des cookies. Vous pouvez le trouver ici: http://www.stoimen.com/blog/2009/04/15/read-the-anchorpart-of-the-url-with-php/

8
VangelisB

La réponse est non.

L'objectif 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 lors du chargement de la page.

Le parcours défile de manière à ce que cette ligne soit le premier contenu visible de la page, en fonction de la quantité de contenu située en dessous de la ligne.

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

7
Qiniso Mdletshe

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

vous pouvez le rediriger avec JavaScript vers PHP cependant.

3
Silfverstrom

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 seulement 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')">Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')">Change to #hash2</a> 

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

La partie d’un URI après le # est appelée "fragment" et est par définition uniquement disponible/traitée côté client (voir https://en.wikipedia.org/wiki/Fragment_identifier ) .

Du côté client, il est possible d’avoir accès à javaScript avec window.location.hash.

1
MrTux
<?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

1
Keshav Kalra

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, exploser ce chiot et obtenir 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
1
Aurora

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

0
Keshav Kalra

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 de la réponse à 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
Matteo Conta