2009-06-02 14 views

Répondre

180

Le problème principal est que le navigateur n'enverra même pas une requête avec une partie de fragment. La partie de fragment est résolue là dans le navigateur. Donc, il est accessible via JavaScript.

De toute façon, vous pouvez analyser une URL en bits, y compris la partie fragment, en utilisant parse_url(), mais ce n'est évidemment pas votre cas.

4

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

vous pouvez le rediriger avec javascript to php si.

48

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

+0

Merci! Donc, pour être clair, à la place de ceci: 'www.example.com/? Val = 1 # part2' Vous auriez à rediriger vers le serveur, comme ceci: ' www.example.com/? redirectUrl =% 2F% 3Fval% 3D1% 23part2' et bien sûr vous devrez ajouter un 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 devriez pas autoriser les redirections vers des urls absolues, seulement des URLs relatives, pour vous assurer que vous ne vous ouvrez pas à des [redirections dangereuses] (https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet) –

94

Test simple, l'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 - quoi que ce soit après la balise de hachage est simplement une recherche d'ancrage sur le client.

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

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

La fonction parse_url() en PHP peut fonctionner que 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çoit les informations de fragment, car il est client seulement.

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 est chargée. La navigation défile de sorte que cette ligne soit le premier contenu visible de la page, en fonction de la quantité de contenu qui suit la ligne.

Oui javascript peut acces, puis un simple appel ajax fera la magie

8

Oui, il est vrai, le serveur ne reçoit 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-anchor-part-of-the-url-with-php/

+2

Cette "solution de contournement" ne vaut rien. Il y a une douzaine de meilleures techniques si vous êtes d'accord avec 2 demandes par page. – umassthrower

+10

Comment ça ne vaut rien? Ce n'est certainement pas sans valeur. Mais là peut-être de meilleures techniques. C'est bien. – Kishor

+1

Merde à hacky. Je suis d'accord avec @umassthrower. –

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

Cela devrait fonctionner

+0

SI vous avez l'URL comme chaîne est facile, même si vous l'analyser 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 –

1

partie Th d'un URI après la # est appelé « fragment » et est, par définition, uniquement disponible/traitement côté client (voir https://en.wikipedia.org/wiki/Fragment_identifier) .

Du côté client, il est possible d'y accéder en utilisant javaScript avec window.location.hash.

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, éclatez que chiot et obtenir 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

Une autre solution est d'ajouter un champ de saisie caché à la page php:

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

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

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

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

$server_location_hash = $_POST['myHiddenLocationHash'];