Http 我可以在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?

Http 我可以在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?,http,language-agnostic,uri-fragment,Http,Language Agnostic,Uri Fragment,假设URL为: www.example.com/?val=1#part2 PHP可以使用GET数组读取请求变量val1 散列值part2是否也可读?或者这只是浏览器和JavaScript的问题?散列永远不会发送到服务器,所以不会。主要问题是浏览器甚至不会发送带有片段部分的请求。片段零件就在浏览器中解析。因此可以通过JavaScript访问它 无论如何,您可以使用将URL解析为位,包括片段部分,但这显然不是您的情况。我认为哈希值仅用于客户端,因此您无法使用php获得它 您可以使用javascri

假设URL为:

www.example.com/?val=1#part2
PHP可以使用GET数组读取请求变量
val1


散列值
part2
是否也可读?或者这只是浏览器和JavaScript的问题?

散列永远不会发送到服务器,所以不会。主要问题是浏览器甚至不会发送带有片段部分的请求。片段零件就在浏览器中解析。因此可以通过JavaScript访问它


无论如何,您可以使用将URL解析为位,包括片段部分,但这显然不是您的情况。

我认为哈希值仅用于客户端,因此您无法使用php获得它


您可以使用javascript将其重定向到php。

它可以从javascript-as
window.location.hash中检索。例如,您可以使用Ajax将其发送到服务器,或者对其进行编码并将其放入URL中,然后将URL传递到服务器端。

简单测试,访问

服务器接收请求时不带#附件-哈希标记后面的任何内容都只是客户端上的锚查找

您可以通过javascript找到URL中使用的锚名称,例如:

<script>alert(window.location.hash);</script>
警报(window.location.hash);
如果您已经拥有所需的url字符串(包括片段()),PHP中的parse_url()函数可以工作:


输出:嘶嘶声
但是我认为PHP不会收到片段信息,因为它只是客户端。

答案是否定的

散列的主要目的是滚动到页面中定义书签的特定部分。e、 g.页面加载时滚动到此部分

浏览将滚动,使该行成为页面中第一个可见内容,具体取决于该行下方的内容数量

是的,javascript可以访问它,然后一个简单的ajax调用就可以发挥神奇的作用


<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>
这是在
#
被称为“片段”之后的第部分,根据定义,它仅在客户端可用/处理(请参阅)

在客户端,可以使用javaScript和
window.location.hash

进行访问。是的,您可以:

使用此方法可防止错误:

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

另一个解决方案是向php页面添加隐藏的输入字段:

<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">
在服务器端的php中,您可以使用$\u POST集合读取此值:

$server_location_hash = $_POST['myHiddenLocationHash'];

我们也可以用另一种方法来实现,比如首先从js中获取哈希值,并使用该参数调用ajax,然后可以做任何我们想做的事情

动态抓取#散列


var urlhash=window.location.hash,//从url获取哈希
txthash=urlhash.replace(“#”和“”)//移除#
//警报(txthash);
要使其更流畅,请执行以下操作:

仅使用Javascript和PHP的完整示例


var urlhash=window.location.hash,//从url获取哈希
txthash=urlhash.replace(“#”和“”)//移除#
函数changehash(a,b){
window.location.hash=b;//将哈希添加到url
//警报(b);//警报测试
location.reload();//重新加载页面以显示当前哈希
}
更改为#hash1
更改为#hash2

如果url为字符串,即使使用reg exp解析也很容易。问题是您无法从服务器访问#photo45(使用phpinfo()而且你不会看到任何在该页面的初始请求上没有任何作用的照片,谢谢!所以要清楚,不要这样:
www.example.com/?val=1#part2
你必须在服务器上重定向到它,就像这样:
www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2
当然你还必须添加对它的支持重定向到其他页面中的其他url。这并不可怕,当然也不适用于所有用例,但适用于书签。请注意,如果您这样做,您不应该允许重定向到绝对url,而只允许重定向到相对url,以确保您不向PHP开放,但仍然不会获得哈希值。甜美且简短的解决方案。这没有任何作用我同意,它适用于后续请求,而不是第一次加载。这对该页面的初始请求没有任何作用
$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag
<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">
$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));
$server_location_hash = $_POST['myHiddenLocationHash'];