Чи можу я прочитати хеш-частину URL-адреси на моєму сервері (PHP, Ruby, Python тощо)?


217

Припустимо URL-адресу:

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

PHP може читати змінні запиту val1за допомогою масиву GET.

Чи part2читається також хеш-значення ? Або це лише до браузера та JavaScript?

Відповіді:


203

Основна проблема полягає в тому, що браузер навіть не надсилає запит із частиною фрагменту. Частина фрагмента вирішена прямо там, у браузері. Тож це доступно через JavaScript.

У будь-якому випадку ви можете розібрати URL-адресу на біти, включаючи частину фрагмента, використовуючи parse_url () , але це, очевидно, не так.


98

Простий тест, доступ до 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 -

Сервер отримує запит без #appendage - все після тегу хеша - це просто пошук прив'язки клієнта.

Ви можете знайти ім'я якоря, яке використовується в URL-адресі через javascript, використовуючи, як приклад:

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

Функція parse_url () в PHP може працювати, якщо у вас вже є потрібна рядок URL-адреси, включаючи фрагмент ( http://codepad.org/BDqjtXix ):

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

Output: fizzbuzz

Але я не думаю, що PHP отримує інформацію про фрагменти, тому що це лише клієнт.


48

Це можна отримати з Javascript - as window.location.hash. Звідти ви можете, наприклад, надіслати його на сервер за допомогою Ajax або кодувати його і ввести його в URL-адреси, які потім можуть бути передані на сторону сервера.


1
Дякую! Тож, щоб було зрозуміло, замість цього: www.example.com/?val=1#part2 Вам доведеться перенаправляти його на сервер, як це: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 і, звичайно, вам доведеться додати підтримку, щоб перенаправити на інший URL на іншій сторінці. Звичайно, це не дивовижно, але це не працює для всіх випадків використання, але працює для закладок. Зауважте, що якщо ви це зробите, вам не слід дозволяти переадресацію на абсолютні URL-адреси, лише на відносні URL-адреси, щоб не відкривати себе для небезпечних переадресацій
Бред Паркс


8

Так, це правда, сервер не отримує якірної частини. Однак існує рішення щодо використання файлів cookie. Ви можете знайти його тут: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
Цей "спосіб вирішення" нічого не вартий. Є десяток кращих прийомів, якщо ви добре з 2 запитами на перегляд сторінки.
umassthrower

11
Як це нікчемно? Це, безумовно, нічого не варте. Але, можливо, і кращі методи. Це добре.
Кішор

Які кращі методи? Для мого google oauth у мене він перенаправляє мене на свою сторінку api з хешем доступу маркера, тоді я роблю "ajax inception", де я надаю швидкий скрипт ajax, який відміняє ту саму сторінку, але з значенням хеша цього разу як параметр запиту . Це дивно. Є, мабуть, кращі способи, але всі способи, які я бачив, здаються
хиткими

7

Відповідь - ні.

Основне призначення хешу - прокрутка до певної частини сторінки, де ви визначили закладку. наприклад, Перейдіть до цієї частини під час завантаження сторінки.

Перегляд буде прокручуватися таким чином, що цей рядок є першим видимим вмістом на сторінці, залежно від того, скільки вмісту слід нижче рядка.

Так, JavaScript може отримати доступ до нього, і тоді простий дзвінок Ajax зробить магію


4

А як на рахунок:

Динамічно захопіть #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;
?>

Щоб зробити його більш вільним:

Повний приклад із використанням лише Javascript та 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 досі не отримує хеш-значення.
розіграш

солодке і коротке рішення.
Waruna Manjula

3

Я думаю, що хеш-значення використовується лише на стороні клієнта, тому ви не можете отримати його за допомогою php.

Ви можете перенаправити його за допомогою javascript на php.


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

Це має працювати


ЯКЩО у вас URL-адреса, оскільки рядок є простим, навіть якщо ви аналізуєте його з reg exp Проблема полягає в тому, що ви не можете отримати доступ до # photo45 з сервера (використовуйте phpinfo () і ви ніде не побачите # photo45
Nik Chankov

1

Частина URI після цього #називається "фрагмент" і за визначенням доступна / обробляється лише на стороні клієнта (див. Https://en.wikipedia.org/wiki/Fragment_identifier ).

На стороні клієнта це можна отримати за допомогою javaScript з window.location.hash.


1

Так, ти можеш:

Використовуйте цей метод для запобігання помилок:

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

І звичайно в PHP, підірвати цього цуценя і отримати одне із значень

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

0

Ще одне рішення - додати приховане поле введення на сторінку php:

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

За допомогою javascript / jQuery ви можете встановити значення цього поля під час завантаження сторінки або відповіді на подію:

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

У php на стороні сервера ви можете прочитати це значення за допомогою колекції $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Ми можемо це зробити і з іншим підходом. Як і в першу чергу, отримаємо хеш-значення від js та викликаємо ajax за допомогою цього параметра і можемо робити все, що нам хочеться

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.