假设URL为:

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


PHP可以使用GET数组读取请求变量val1

哈希值part2也可读吗?还是仅取决于浏览器和JavaScript?

#1 楼

主要问题是浏览器甚至不会发送带有片段部分的请求。片段部分在浏览器中已解决。因此,它可以通过JavaScript达到。

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

#2 楼

简单测试,访问http:// localhost:8000 / hello?foo = bar#this-is-not-sent-to-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的请求-哈希标记之后的任何内容都只是在客户端上的锚点查找。

您可以通过javascript使用以下示例在URL中使用锚点名称:

<script>alert(window.location.hash);</script>


如果已经具有所需的URL字符串(包括片段)(http://codepad.org/BDqjtXix),则PHP中的parse_url()函数可以正常工作:

<?
echo parse_url("http://foo?bar#fizzbuzz",PHP_URL_FRAGMENT);
?>

Output: fizzbuzz


但是我不认为PHP会接收片段信息,因为它仅用于客户端。

#3 楼

它可以从Java语言中检索为window.location.hash。从那里,您可以将其发送到例如带有Ajax的服务器,或对其进行编码并将其放入URL中,然后可以将其传递到服务器端。

评论


谢谢!因此,要清楚一点,而不是这样:www.example.com/?val=1#part2您必须在服务器上重定向到它,就像这样:www.example.com/?redirectUrl=%2F%3Fval% 3D1%23part2,当然,您必须添加支持才能重定向到其他页面中的该其他URL。不太好,当然不适用于所有用例,但确实适用于书签。请注意,如果您这样做,则不应允许重定向到绝对网址,而只能是相对网址,以确保您不会对不安全的重定向开放

–布拉德公园
17年5月11日在12:11



#4 楼

哈希永远不会发送到服务器,所以不会。

#5 楼

答案是否定的。

哈希的主要目的是滚动到页面上已定义书签的特定部分。例如页面加载时滚动到该部分。

浏览器将滚动,以使该行是页面中的第一可见内容,这取决于该行下方的内容。

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

#6 楼

关于什么:

动态抓取#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仍然没有获得哈希值。

–cornernote
19年8月8日,0:40

甜蜜而短暂的解决方案。

–Waruna Manjula
6月7日15:42

#7 楼

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

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

#8 楼

#之后的URI的这一部分称为“片段”,根据定义,它仅在客户端可用/处理(请参阅https://en.wikipedia.org/wiki/Fragment_identifier)。

在客户端,可以使用带有window.location.hash的javaScript访问。

#9 楼

<?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

– Nik Chankov
2015年3月3日14:35

这对该页面的初始请求没有任何作用

– Nico Haase
8月21日8:12

#10 楼

是的,您可以:

使用此方法来防止错误:

<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


评论


这对该页面的初始请求没有任何作用

– Nico Haase
8月21日8:12

#11 楼

我们也可以用另一种方法做到这一点,就像首先从js获取哈希值并使用该参数调用ajax一样,我们可以做任何我们想做的事情

#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'];


评论


这对该页面的初始请求没有任何作用

– Nico Haase
8月21日8:11



我同意,它适用于后续请求,而不适用于首次加载。

–马特奥·康塔(Matteo Conta)
8月25日12:12