Czy mogę odczytać część skrótu adresu URL w mojej aplikacji po stronie serwera (PHP, Ruby, Python itp.)?

217

Zakładając adres URL:

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

PHP może odczytać zmienne żądania val1za pomocą tablicy GET.

Czy wartość skrótu jest part2również czytelna? A może jest to tylko przeglądarka i JavaScript?

Błysk
źródło

Odpowiedzi:

203

Głównym problemem jest to, że przeglądarka nawet nie wyśle ​​żądania z fragmentem fragmentu. Fragment jest rozwiązywany bezpośrednio w przeglądarce. Jest to możliwe dzięki JavaScript.

W każdym razie możesz parsować adres URL na bity, w tym fragment fragmentu, używając parse_url () , ale oczywiście nie jest to twój przypadek.

Ionuț G. Stan
źródło
98

Prosty test, dostęp do 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 -

Serwer odbiera żądanie bez #appendage - wszystko po znaczniku hash jest po prostu szukaniem zakotwiczenia na kliencie.

Możesz znaleźć nazwę kotwicy używaną w adresie URL za pomocą javascript, używając na przykład:

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

Funkcja parse_url () w PHP może działać, jeśli masz już potrzebny ciąg adresu URL zawierający fragment ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Ale nie sądzę, że PHP otrzymuje informacje o fragmentach, ponieważ są one przeznaczone tylko dla klientów.

Tomek
źródło
48

Można go odzyskać z Javascript - as window.location.hash. Stamtąd możesz wysłać go na serwer za pomocą Ajax, na przykład, lub zakodować i umieścić w adresach URL, które mogą być następnie przekazywane po stronie serwera.

Alister Bulman
źródło
1
Dzięki! Żeby było jasne, zamiast tego: www.example.com/?val=1#part2 musiałbyś przekierować do niego na serwerze, w ten sposób: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 i oczywiście musisz dodać obsługę, aby przekierować do tego innego adresu URL na drugiej stronie. Nie niesamowite i oczywiście nie działa we wszystkich przypadkach użycia, ale działa w przypadku zakładek. Pamiętaj, że jeśli to zrobisz, nie powinieneś zezwalać na przekierowania na bezwzględne adresy URL, tylko względne adresy URL, aby mieć pewność, że nie otworzysz się na niebezpieczne przekierowania
Brad Parks
25

Hash nigdy nie jest wysyłany na serwer, więc nie.

PatrikAkerstrand
źródło
8

Tak, to prawda, serwer nie otrzymuje części zakotwiczenia. Istnieje jednak obejście polegające na stosowaniu plików cookie. Można go znaleźć tutaj: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

VangelisB
źródło
2
To „obejście” jest bezwartościowe. Istnieje kilkanaście lepszych technik, jeśli nie masz nic przeciwko 2 żądaniom na wyświetlenie strony.
umassthrower
11
Jak to jest bezwartościowe? To zdecydowanie nie jest bezwartościowe. Ale mogą być lepsze techniki.
Kishor,
Jakie są lepsze techniki? W przypadku google oauth przekierowuje mnie na moją stronę API za pomocą skrótu tokena dostępu, a następnie wykonuję „incepcję ajax”, w której renderuję szybki skrypt ajax, który ajaxuje tę samą stronę, ale z wartością skrótu tym razem jako parametr żądania . To dziwne ... prawdopodobnie są lepsze sposoby, ale wszystkie sposoby, które widziałem, wydają się hacky
Gisheri
7

Odpowiedź brzmi nie.

Głównym celem skrótu jest przewinięcie do określonej części strony, na której zdefiniowano zakładkę. np. Przewiń do tej części po załadowaniu strony.

Przeglądanie będzie przewijane w taki sposób, że ten wiersz jest pierwszą widoczną treścią na stronie, w zależności od tego, ile treści znajduje się poniżej tego wiersza.

Tak, javascript może uzyskać do niego dostęp, a wtedy proste wywołanie ajax zrobi magię

Qiniso
źródło
4

Co powiesz na:

Dynamicznie chwyć # skrót

<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;
?>

Aby uczynić go bardziej płynnym:

Pełny przykład z wykorzystaniem tylko Javascript i 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
źródło
PHP nadal nie otrzymuje wartości skrótu.
cornernote
słodkie i krótkie rozwiązanie.
Waruna Manjula
3

Myślę, że wartość skrótu jest używana tylko po stronie klienta, więc nie można jej uzyskać za pomocą php.

możesz jednak przekierować go za pomocą javascript do php.

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

To powinno działać

Keshav Kalra
źródło
JEŻELI masz adres URL, ponieważ ciąg znaków jest łatwy, nawet jeśli przeanalizujesz go za pomocą reg exp exp. Problem polega na tym, że nie możesz uzyskać dostępu do # photo45 z serwera (użyj phpinfo () i nigdzie nie zobaczysz # photo45
Nik Chankov
1

Tak, możesz:

Użyj tej metody, aby zapobiec błędom:

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

I oczywiście w PHP, eksploduj tego szczeniaka i zdobądź jedną z wartości

$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag
Zorza polarna
źródło
0

Innym rozwiązaniem jest dodanie ukrytego pola wejściowego do strony php:

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

Za pomocą javascript / jQuery możesz ustawić wartość tego pola na ładowanie strony lub reagowanie na zdarzenie:

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

W php po stronie serwera możesz odczytać tę wartość za pomocą kolekcji $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];
Matteo Conta
źródło
0

Możemy to zrobić również przy użyciu innego podejścia, na przykład najpierw pobierz wartość skrótu z js i wywołaj ajax za pomocą tego parametru i możemy zrobić, co chcemy

Keshav Kalra
źródło