Могу ли я прочитать хэш-часть 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 # это-не-отправлено-на-сервер

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 - как window.location.hash. Оттуда вы можете отправить его на сервер, например, с помощью Ajax, или закодировать его и поместить в URL-адреса, которые затем можно будет передать на серверную сторону.


1
Спасибо! Итак, чтобы быть ясным, вместо этого: www.example.com/?val=1#part2 вам придется перенаправить на него на сервере, как это: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 и, конечно, вам нужно добавить в поддержку, чтобы перенаправить на этот другой URL на другой странице. Не удивительно, и не работает для всех случаев использования, конечно, но работает для закладок. Обратите внимание, что если вы сделаете это, вы не должны разрешать перенаправления на абсолютные URL-адреса, только относительные URL-адреса, чтобы гарантировать, что вы не будете открыты для небезопасных перенаправлений
— Брэд Паркс


8

Да, это правда, сервер не получает якорную часть. Однако есть обходной путь с использованием куки. Вы можете найти его здесь: 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», где я рендерим быстрый сценарий ajax, который ajaxe ту же страницу, но со значением хеша на этот раз в качестве параметра запроса , Это кажется странным ... есть, вероятно, лучшие способы, но все способы, которые я видел, кажутся
— хакерскими

7

Ответ - нет.

Основное назначение хэша - прокрутить до определенной части страницы, где вы определили закладку. например, прокрутите до этой части при загрузке страницы.

Обзор будет прокручиваться так, что эта строка будет первым видимым контентом на странице, в зависимости от того, сколько контента следует за линией.

Да, javascript может получить к нему доступ, и тогда простой вызов ajax сделает волшебство


4

Что о:

Динамически захватить хэш

<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 по-прежнему не получает хеш-значение.
— угловой

сладкое и короткое решение.
— Варуна Манджула

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
— Ник Чанков

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.