Могу ли я прочитать хэш-часть URL-адреса в моем серверном приложении (PHP, Ruby, Python и т. Д.)?
Предполагая URL-адрес:
www.example.com/?val=1#part2
PHP может читать переменные запроса val1
используя массив GET.
Является ли значение хеша part2
также читается? Или это только до браузера и JavaScript?
14 ответов
Основная проблема в том, что браузер даже не отправит запрос с фрагментной частью. Часть фрагмента разрешается прямо в браузере. Так что это доступно через JavaScript.
В любом случае, вы можете разбить URL на биты, включая фрагментную часть, используя parse_url (), но это, очевидно, не ваш случай.
Простой тест, доступ к 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 получает информацию фрагмента, потому что это только для клиента.
Это можно получить из Javascript - как window.location.hash
, Оттуда вы можете отправить его на сервер, например, с помощью Ajax, или закодировать его и поместить в URL-адреса, которые затем можно будет передать на серверную сторону.
Ответ - нет.
Основное назначение хэша - прокрутить до определенной части страницы, где вы определили закладку. например, прокрутите до этой части при загрузке страницы.
Обзор будет прокручиваться так, что эта строка будет первым видимым контентом на странице, в зависимости от того, сколько контента следует за линией.
Да, Javascript может получить доступ к нему, и тогда простой вызов Ajax сделает волшебство
Да, это правда, сервер не получает якорную часть. Однако есть обходной путь с использованием куки. Вы можете найти его здесь: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/
Как насчет:
Динамически захватить #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.
Вы можете перенаправить его с помощью JavaScript на PHP, хотя.
Часть URI после #
называется "фрагмент" и по определению доступен только / обрабатывается на стороне клиента (см. https://en.wikipedia.org/wiki/Fragment_identifier).
На стороне клиента, это может быть доступно с помощью javaScript с window.location.hash
,
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>
Это должно работать
Да, ты можешь:
Используйте этот метод для предотвращения ошибок:
<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
Вот более полный код, с которого вы можете начать:
<script>
sendTokenParameter();
function sendTokenParameter() {
if (!window.location.hash) {
return;
}
const id_token = window.location.hash.split('&').filter(function(el) { if(el.match('id_token') !== null) return true; })[0].split('=')[1];
if (!id_token) {
console.error('No token returned');
return;
}
window.location.href = `${window.location.pathname}?id_token=${id_token}`
}
</script>
<?php
process_login();
function process_login() {
$id_token = $_GET['id_token'];
if (!$id_token) {
// Let the javascript code to send the token
return;
}
// Do stuff with the token
}
?>
Мы можем сделать это и с другим подходом: например, сначала получить значение хеша из js, вызвать ajax, используя этот параметр, и делать то, что мы хотим
Другое решение - добавить скрытое поле ввода на страницу php:
<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">
Используя javascript/jQuery, вы можете установить значение этого поля при загрузке страницы или при ответе на событие:
$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));
В php на стороне сервера вы можете прочитать это значение, используя коллекцию $_POST:
$server_location_hash = $_POST['myHiddenLocationHash'];