it-swarm.com.de

Kann ich den Hash-Teil der URL in meiner serverseitigen Anwendung (PHP, Ruby, Python usw.) lesen?

Angenommen, eine URL von:

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

PHP kann die Anforderungsvariablen val1 mithilfe des GET-Arrays lesen.

Ist der Hashwert part2 auch lesbar? Oder geht es nur um Browser und JavaScript?

206
Robinicks

Das Hauptproblem ist, dass der Browser nicht einmal eine Anfrage mit einem Fragment-Teil sendet. Der Fragmentteil wird direkt im Browser aufgelöst. Es ist also über JavaScript erreichbar.

Jedenfalls können Sie eine URL mit parse_url () in Bits analysieren, einschließlich des Fragmentteils. Dies ist jedoch offensichtlich nicht Ihr Fall.

192
Ionuț G. Stan

Einfacher Test mit Zugriff auf http: // localhost: 8000/hello? Foo = bar # this-is-not-send-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 -

Der Server empfängt die Anfrage ohne #appendage - alles nach dem Hash-Tag ist lediglich eine Ankersuche auf dem Client.

Sie können den Ankernamen, der in der URL verwendet wird, über Javascript als Beispiel suchen:

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

Die Funktion parse_url () in PHP kann funktionieren, wenn Sie bereits über die erforderliche URL-Zeichenfolge einschließlich des Fragments verfügen ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Ich glaube jedoch nicht, dass PHP die Fragmentinformationen erhält, da dies nur für den Client gilt.

95
tom

Es ist von Javascript abrufbar - als 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 zur Serverseite weitergeleitet werden können.

48
Alister Bulman

Der Hash wird niemals an den Server gesendet, also nein.

25

Ja, es stimmt, der Server erhält den Ankerteil nicht. Es gibt jedoch eine Problemumgehung mit Cookies. Sie finden es hier: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

8
VangelisB

Die Antwort ist nein.

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

Das Durchsuchen wird so verschoben, dass diese Zeile der erste sichtbare Inhalt der Seite ist, je nachdem, wie viel Inhalt unterhalb der Zeile angezeigt wird.

Ja, Javascript kann darauf zugreifen, und dann wird ein einfacher Ajax-Aufruf die Magie bewirken

7
Qiniso Mdletshe

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

sie könnten es jedoch mit Javascript auf PHP umleiten.

3
Silfverstrom

Wie wäre es mit:

Nimm dynamisch den #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;
?>

Um es flüssiger zu machen:

Vollständiges Beispiel nur mit Javascript und 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

Der Teil eines URI nach dem # heißt "Fragment" und ist definitionsgemäß nur auf Clientseite verfügbar/verarbeitet (siehe https://en.wikipedia.org/wiki/Fragment_identifier ). .

Auf der Clientseite kann über javaScript mit window.location.hash darauf zugegriffen werden.

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

Das sollte funktionieren

1
Keshav Kalra

Ja, du kannst:

Verwenden Sie diese Methode, um Fehler zu vermeiden:

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

Und natürlich in PHP, explodiere diesen Welpen und hol dir einen der Werte

$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

Wir können es auch mit einem anderen Ansatz machen. Holen Sie sich zunächst den Hashwert von js und rufen Sie den Ajax mit diesem Parameter auf und können Sie tun, was wir wollen 

0
Keshav Kalra

Eine andere Lösung besteht darin, der PHP-Seite ein verstecktes Eingabefeld hinzuzufügen:

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

Mit Javascript/jQuery können Sie den Wert dieses Feldes beim Laden der Seite oder beim Reagieren auf ein Ereignis festlegen:

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

In PHP auf der Serverseite können Sie diesen Wert mit der $ _POST-Auflistung lesen:

$server_location_hash = $_POST['myHiddenLocationHash'];
0
Matteo Conta