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?

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.


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.


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.


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


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/


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ę


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

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.


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ć


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

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'];

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.