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

230

假设有如下URL:

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

PHP可以通过GET数组读取请求变量val1

哈希值part2是否也可读取?还是这只限于浏览器和JavaScript?

13个回答

213

主要问题是浏览器甚至不会发送一个带有片段标识符的请求。片段标识符将在浏览器中解析,因此可以通过JavaScript访问。

无论如何,你可以使用parse_url()函数将URL解析成各个部分,包括片段标识符,但显然这并不是你所需要的情况。


101

简单测试,访问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 -
服务器收到的请求没有 # 符号后面的部分 - 井号后的内容仅在客户端进行锚点查找。
例如,您可以使用javascript查找URL中使用的锚点名称:
<script>alert(window.location.hash);</script>

在PHP中,parse_url()函数可以处理包含片段的URL字符串(http://codepad.org/BDqjtXix):

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

Output: fizzbuzz

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


49

它可以通过Javascript获取 - 如window.location.hash。从那里,您可以将其发送到服务器,例如使用Ajax,或对其进行编码并将其放入URL中,然后可以通过传递到服务器端。


2
谢谢!因此,为了明确,您需要在服务器上重定向它,而不是像这样:www.example.com/?val=1#part2您必须这样做:www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2当然,在其他页面中,您还必须加入支持重定向到该URL的功能。 当然并非所有用例都适用,但对于书签而言可以工作。请注意,如果您这样做,则不应允许重定向到绝对URL,只能使用相对URL,以确保不会开放自己的不安全重定向 - Brad Parks

26

哈希值从不发送到服务器,因此不行。


9
答案是否定的。
哈希的主要目的是滚动到页面中定义书签的特定部分。例如,当页面加载时滚动到此部分。
浏览器将滚动,以使此行成为页面中第一个可见内容,具体取决于该行下方有多少内容。
是的,JavaScript可以访问它,然后一个简单的ajax调用就可以完成这个功能。

5

关于:

动态获取#哈希标记

<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
简洁明了的解决方案。 - Waruna Manjula

3
我认为哈希值仅在客户端使用,因此你无法使用php获取它。但是你可以使用javascript将其重定向到php。

2

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

这应该可以工作


如果你有URL字符串,那么即使使用正则表达式解析也很容易。问题在于你无法从服务器访问#photo45(使用phpinfo(),你不会在任何地方看到#photo45)。 - Nik Chankov
在该页面的初始请求中没有任何操作。 - Nico Haase

0
我们也可以采用另一种方法,比如首先从js获取哈希值,然后使用该参数调用ajax并进行任何我们想要的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接