Могу ли я прочитать хэш-часть URL-адреса в моем серверном приложении (PHP, Ruby, Python и т. Д.)?

217

Предполагая URL-адрес:

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

PHP может читать переменные запроса, val1используя массив GET.

Является ли значение хеш-функции part2доступным для чтения? Или это только до браузера и JavaScript?

Вспышка
источник

Ответы:

203

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

В любом случае, вы можете разбить URL на биты, включая фрагментную часть, используя parse_url () , но это, очевидно, не ваш случай.

Ionuț G. Stan
источник
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-адреса, чтобы гарантировать, что вы не будете открыты для небезопасных перенаправлений
Брэд Паркс
25

Хеш никогда не отправляется на сервер, поэтому нет.

PatrikAkerstrand
источник
8

Да, это правда, сервер не получает якорную часть. Однако есть обходной путь с использованием куки. Вы можете найти его здесь: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

VangelisB
источник
2
Этот «обходной путь» ничего не стоит. Существует более десятка лучших техник, если вы согласны с 2 запросами на просмотр страницы.
Umassthrower
11
Как это бесполезно? Это определенно ничего не стоит. Но там, может быть, лучшие методы. Это хорошо.
Кишор
Каковы лучшие методы? Для моего google oauth он перенаправляет меня на мою страницу API с хэшем токена доступа, затем я делаю «начало ajax», где я рендерим быстрый сценарий ajax, который ajaxe ту же страницу, но со значением хеша на этот раз в качестве параметра запроса , Это кажется странным ... есть, вероятно, лучшие способы, но все способы, которые я видел, кажутся
хакерскими
7

Ответ - нет.

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

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

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

Qiniso
источник
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; ?> 
samjco
источник
PHP по-прежнему не получает хеш-значение.
угловой
сладкое и короткое решение.
Варуна Манджула
3

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

Вы можете перенаправить его с помощью JavaScript на PHP, хотя.

Silfverstrom
источник
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.

MrTux
источник
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, используя этот параметр, и делать то, что мы хотим

Кешав Калра
источник