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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Сервер получает запрос без #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 получает информацию о фрагменте, потому что она только для клиента.

Ответ 3

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

Ответ 4

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

Ответ 6

Ответ - нет.

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

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

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

Ответ 7

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

вы могли бы перенаправить его с javascript на php, хотя.

Ответ 8

Да, вы можете:

Используйте этот метод для предотвращения ошибок:

<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

Ответ 9

Как насчет:

Динамически захватить #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')">Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')">Change to #hash2</a> 

<?php echo "This is the current hash: " . $hash; ?> 

Ответ 10

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

Это должно работать

Ответ 11

Th часть URI после того, как # называется "фрагмент" и по определению доступна только для обработки/обработки на стороне клиента ( см. https://en.wikipedia.org/wiki/Fragment_identifier).

На стороне клиента это можно получить с помощью javaScript с window.location.hash.

Ответ 12

Другим решением является добавление скрытого поля ввода на страницу php:

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

Используя javascript/jQuery, вы можете установить значение этого поля при загрузке страницы или отвечать на событие:

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

В php на стороне сервера вы можете прочитать это значение с помощью коллекции $_POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

Ответ 13

Мы можем сделать это и с другим подходом: например, сначала получить значение хеша из js, вызвать ajax, используя этот параметр, и делать то, что мы хотим