2009-06-02 14 views

Antwort

180

Das Hauptproblem ist, dass der Browser nicht einmal eine Anfrage mit einem Fragmentteil senden wird. Der Fragmentteil wird genau dort im Browser aufgelöst. Also ist es über JavaScript erreichbar.

Wie auch immer, Sie könnten eine URL in Bits zerlegen, einschließlich des Fragmentteils, mit parse_url(), aber es ist offensichtlich nicht Ihr Fall.

4

Ich denke, der Hash-Wert wird nur clientseitig verwendet, so dass Sie es nicht mit PHP bekommen können.

können Sie es jedoch mit Javascript zu PHP umleiten.

48

Es ist abrufbar von Javascript - wie window.location.hash. Von dort könnten Sie es beispielsweise mit Ajax an den Server senden oder es kodieren und in URLs einfügen, die dann an die Server-Seite weitergeleitet werden können.

+0

Vielen Dank! Also um klar zu sein, anstatt dies: 'www.example.com/? Val = 1 # part2' Sie müssten auf dem Server, wie folgt umleiten: ' www.example.com/? redirectUrl =% 2F% 3Fval% 3D1% 23part2' und natürlich müssen Sie Unterstützung hinzufügen, um zu dieser anderen URL auf Ihrer anderen Seite umzuleiten. Nicht genial, und funktioniert natürlich nicht für alle Anwendungsfälle, aber funktioniert für Lesezeichen. Wenn Sie dies tun, sollten Sie keine Umleitungen auf absolute URLs zulassen, sondern nur relative URLs, um sicherzustellen, dass Sie sich nicht für [unsichere Weiterleitungen] öffnen (https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet). –

94

Einfacher Test erhält 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 - 

Zugriff auf den Server die Anfrage ohne #appendage - alles nach dem Hash-Tag ist einfach ein Anker-Lookup auf dem Client.

Sie können den Namen des Ankers als ein Beispiel in der URL über Javascript verwenden, verwendet finden:

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

Die parse_url() Funktion in PHP kann funktionieren, wenn Sie bereits die benötigte URL-Zeichenfolge einschließlich des Fragments haben (http://codepad.org/BDqjtXix):

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

Output: fizzbuzz 

Aber ich glaube nicht, PHP, um die Fragmentinformationen erhält, weil es nur Client.

7

Die Antwort ist nein.

Der Hauptzweck des Hash ist das Scrollen zu einem bestimmten Teil der Seite, auf der Sie ein Lesezeichen definiert haben. z.B. Scrollen Sie zu diesem Teil, wenn die Seite geladen wird.

Der Browser wird so scrollen, dass diese Zeile der erste sichtbare Inhalt auf der Seite ist, abhängig davon, wie viel Inhalt unterhalb der Zeile folgt.

Ja Javascript kann acces, und dann ein einfacher Ajax-Aufruf wird die Magie

8

Ja, es ist wahr zu tun, wird der Server nicht den Ankerteil bekommen. Es gibt jedoch eine Umgehung mit Cookies.Sie können es hier finden: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

+2

Dieser "Workaround" ist wertlos. Es gibt ein Dutzend bessere Techniken, wenn Sie mit 2 Anfragen pro Seite zufrieden sind. – umassthrower

+10

Wie ist es wertlos? Das ist definitiv nicht wertlos. Aber es gibt vielleicht bessere Techniken. Das ist in Ordnung. – Kishor

+1

Verdammt Hacky. Ich stimme @umassthrower zu. –

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

Dies sollte nach dem # wird „Fragment“

+0

WENN du die URL als String hast, ist einfach, auch wenn du es mit reg exp parst. Das Problem ist, dass Sie vom Server nicht auf # photo45 zugreifen können (verwenden Sie phpinfo() und Sie werden # photo45 nirgendwo sehen –

1

Ja, Sie können:

Verwenden Sie diese Methode verhindern Fehler:

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

Und natürlich in PHP, dass die Welpen explodieren und

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

Eine andere Lösung einer der Werte erhalten ist ein verstecktes Eingabefeld zur PHP-Seite hinzuzufügen:

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

mit JavaScript/jQuery Sie den Wert dieses Feldes auf der Seite zu laden oder die Reaktion auf ein Ereignis einstellen:

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

in PHP auf der Server-Seite Sie diesen Wert lesen können, die $ _POST Sammlung mit:

$server_location_hash = $_POST['myHiddenLocationHash'];