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

217

Angenommen, eine URL von:

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

PHP kann die Anforderungsvariablen val1mithilfe des GET-Arrays lesen .

Ist der Hashwert part2auch lesbar? Oder liegt das nur am Browser und an JavaScript?

Der Blitz
quelle

Antworten:

203

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

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

Ionuț G. Stan
quelle
98

Einfacher Test, Zugriff auf http: // localhost: 8000 / hello? Foo = bar # Dies wird nicht an den Server gesendet

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 Anforderung ohne #appendage - alles, was nach dem Hash-Tag steht, ist einfach eine Ankersuche auf dem Client.

Sie finden den in der URL verwendeten Ankernamen über Javascript als Beispiel:

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

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

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

Output: fizzbuzz

Ich glaube jedoch nicht, dass PHP die Fragmentinformationen empfängt, da diese nur für Clients bestimmt sind.

Tom
quelle
48

Es kann aus Javascript abgerufen werden - as window.location.hash. Von dort aus können Sie es beispielsweise mit Ajax an den Server senden oder verschlüsseln und in URLs einfügen, die dann an den Server weitergeleitet werden können.

Alister Bulman
quelle
1
Vielen Dank! Um dies zu verdeutlichen: www.example.com/?val=1#part2 Sie müssten auf dem Server wie folgt darauf umleiten: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 und natürlich müssten Sie Unterstützung hinzufügen, um auf diese andere URL auf Ihrer anderen Seite umzuleiten. Nicht großartig und funktioniert natürlich nicht für alle Anwendungsfälle, aber für Lesezeichen. Beachten Sie, dass Sie in diesem Fall keine Weiterleitungen zu absoluten URLs zulassen sollten, sondern nur zu relativen URLs, um sicherzustellen, dass Sie sich nicht für unsichere Weiterleitungen
Brad Parks
25

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

PatrikAkerstrand
quelle
8

Ja, es stimmt, der Server erhält das 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/

VangelisB
quelle
2
Diese "Problemumgehung" ist wertlos. Es gibt ein Dutzend bessere Techniken, wenn Sie mit 2 Anfragen pro Seitenaufruf einverstanden sind.
umassthrower
11
Wie ist es wertlos? Das ist definitiv nicht wertlos. Aber es gibt vielleicht bessere Techniken. Das ist in Ordnung.
Kishor
Was sind die besseren Techniken? Für mein Google Oauth habe ich es mit dem Zugriffstoken-Hash auf meine API-Seite umgeleitet, dann mache ich einen "Ajax-Beginn", bei dem ich ein schnelles Ajax-Skript rendere, das dieselbe Seite ajaxt, diesmal jedoch mit dem Hash-Wert als Anforderungsparameter . Es fühlt sich komisch an .. es gibt wahrscheinlich bessere Wege, aber alle Wege, die ich gesehen habe, scheinen hacky
Gisheri
7

Die Antwort ist nein.

Der Hauptzweck des Hash besteht darin, zu einem bestimmten Teil der Seite zu scrollen, auf dem Sie ein Lesezeichen definiert haben. zB Scrollen Sie zu diesem Teil, wenn die Seite geladen wird.

Beim Durchsuchen wird so gescrollt, dass diese Zeile der erste sichtbare Inhalt auf der Seite ist, je nachdem, wie viel Inhalt unter der Zeile folgt.

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

Qiniso
quelle
4

Wie wäre es mit:

Schnapp dir 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 mit nur 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')" 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; ?> 
Samjco
quelle
PHP erhält immer noch nicht den Hashwert.
Cornernote
süße und kurze Lösung.
Waruna Manjula
3

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

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

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

Das sollte funktionieren

Keshav Kalra
quelle
WENN Sie die URL als Zeichenfolge haben, ist dies einfach, auch wenn Sie sie mit reg exp analysieren. Das Problem ist, dass Sie vom Server aus nicht auf # photo45 zugreifen können (verwenden Sie phpinfo () und nirgendwo # photo45 sehen
Nik Chankov
1

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

Auf der Client-Seite kann mit JavaScript mit darauf zugegriffen werden window.location.hash.

MrTux
quelle
1

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, explodieren Sie diesen Welpen und erhalten Sie 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
Aurora
quelle
0

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 Felds 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'];
Matteo Conta
quelle
0

Wir können es auch mit einem anderen Ansatz tun. Als erstes erhalten wir den Hash-Wert von js und rufen den Ajax mit diesem Parameter auf und können tun, was wir wollen

Keshav Kalra
quelle