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

http url web language-agnostic uri-fragment

205946 观看

12回复

假设URL为:

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

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

哈希值是否part2也可读?或者这只是浏览器和JavaScript?

作者: Robinicks 的来源 发布者: 2019 年 7 月 26 日

回应 (12)


195

决定

主要问题是浏览器甚至不会发送带有片段部分的请求。片段部分在浏览器中解析。所以它可以通过JavaScript访问。

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

作者: Ionuț G. Stan 发布者: 02.06.2009 05:45

97

简单测试,访问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的情况下接收请求 - 在哈希标记之后的任何内容都只是客户端上的锚点查找。

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

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

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

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

Output: fizzbuzz

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

作者: tom 发布者: 02.06.2009 05:57

48

它可以从Javascript中检索 - as window.location.hash。从那里你可以用Ajax将它发送到服务器,或者编码并将其放入URL然后可以传递到服务器端。

作者: Alister Bulman 发布者: 02.06.2009 05:53

25

哈希从不发送到服务器,所以没有。

作者: PatrikAkerstrand 发布者: 02.06.2009 05:44

8

是的,这是真的,服务器没有获得锚点部分。但是有一种使用cookie的解决方法。你可以在这里找到它:http//www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

作者: VangelisB 发布者: 19.10.2011 05:58

7

答案是不。

哈希的主要目的是滚动到已定义书签的页面的某个部分。例如,页面加载时滚动到此部分。

浏览将滚动,使得此行是页面中的第一个可见内容,具体取决于该行下方有多少内容。

是的,javascript可以访问它,然后一个简单的ajax调用将做的魔术

作者: Qiniso 发布者: 29.06.2011 01:06

3

我认为哈希值只用于客户端,所以你无法用php获取它。

你可以用javascript将它重定向到php。

作者: Silfverstrom 发布者: 02.06.2009 05:47

2

是的你可以:

使用此方法可以防止错误:

<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
作者: Aurora 发布者: 07.03.2017 03:21

1

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

这应该工作

作者: Keshav Kalra 发布者: 17.07.2014 05:11

1

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

在客户端,可以使用javaScript访问它window.location.hash

作者: MrTux 发布者: 27.12.2016 06:15

0

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

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

使用javascript / jQuery,您可以在页面加载或响应事件时设置此字段的值:

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

在服务器端的php中,您可以使用$ _POST集合读取此值:

$server_location_hash = $_POST['myHiddenLocationHash'];
作者: Matteo Conta 发布者: 30.03.2017 01:24

0

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

作者: Keshav Kalra 发布者: 15.05.2018 04:07
32x32