为什么 URL 的哈希部分在服务器端不可用?

IT技术 php javascript url hash href
2021-01-12 23:01:54

例如,如果我输入 URL:

http://www.foo.com/page.php?parameter=kickme#MOREURL

然后在服务器上没有部分:#MOREURL

是否可以在没有 jQuery AJAX 的情况下将这些部分发送或获取到服务器?

4个回答

不,它仅对浏览器可用,因此您必须使用 Javascript 来处理它。服务器无法读取它。

说明:
基本上页面 URL 的散列组件(# 符号后面的部分)仅由浏览器处理 - 浏览器从不将其传递给服务器。遗憾的是,这是 HTML 标准的一部分,无论您使用的是 IE 还是任何其他浏览器(就此而言,PHP 或任何其他服务器端技术)都是一样的。

以下是维基百科对此的描述:

片段标识符的功能与 URI 的其余部分不同:即,它的处理完全在客户端进行,没有服务器的参与当代理(例如 Web 浏览器)从 Web 服务器请求资源时,代理将 URI 发送到服务器,但不发送片段。而是代理等待服务器发送资源,然后代理根据分片值对资源进行处理。在最常见的情况下,代理将网页向下滚动到具有等于片段值的属性字符串的锚元素。其他客户端行为是可能的

很好的答案!我一直在试图找出为什么 URL 中的部分之后#没有被发送到服务器。
2021-03-13 23:01:54
不@what,那不可靠。如果散列在查询字符串之后,%23则将被简单地视为值的一部分,即?foo=bar%23what,将导致服务器逐字解释为 $foo = 'bar#what'。
2021-03-20 23:01:54
我在网上搜索了很长时间试图理解为什么 PHP 无法读取用户输入的完整 URL 或点击的链接中的完整 URL 后,我终于推断出这种浏览器行为。令人沮丧的是,这在网络上没有更好的记录。这是少数正确的答案之一。这意味着 PHP 无法对包含锚名称的传入 URL 进行重定向或执行任何其他操作——多么糟糕的设计!
2021-03-20 23:01:54
@OliverWilliams 更好的方法是使用查询参数
2021-03-25 23:01:54
嗯,其实你可以urlencode('#')哈希为“%23”,然后urldecode('%23')以“#”再次在服务器上,因此它不会得到转移到服务器。这不使用 OP 要求的 JavaScript,而是使用 PHP。如果您也不想使用 PHP,您可以在 HTML 代码中手动编写“%23”;-)
2021-04-02 23:01:54

https://www.rfc-editor.org/rfc/rfc2396#section-4

当使用 URI 引用对标识的资源执行检索操作时,可选的片段标识符与 URI 用交叉线(“#”)字符分隔,由检索后由用户代理解释的附加引用信息组成行动已成功完成。因此,它不是 URI 的一部分,但经常与 URI 结合使用。

@user439866:哈希几乎就像电话系统中的分机号码。这是“接收方”。您拨打电话号码,然后拨打分机号 - 但分机号实际上并不是电话号码的一部分(除非它是某种直拨系统) - 分机号是“额外”部分,由接收电话系统单独处理. 我实际上对电话系统的工作原理知之甚少,所以这个类比可能是不正确的。
2021-03-26 23:01:54
总而言之,#MOREURL 不是发送到服务器吗?仅使用 jQuery/AJAX/Javascript 方法。
2021-03-30 23:01:54
jQuery 和 AJAX 与此无关。它只能通过 Javascript 或可能的其他客户端脚本语言访问。不是服务器端。
2021-04-05 23:01:54

我想延长的原因,答案为什么片段不被发送到服务器。因为这是有意的和期望的行为。让我们看看整个 URL 字符串。

/path/to/element?query=string&for=server#?optional=fragment&for=browser <----- URI ----> <---- QUERY STRING ---> <----- FRAGMENT STRING ------>

URI唯一指定从服务器获取的资源

QUERY定义服务器对资源执行的操作

FRAGMENT控制浏览器(应用程序)行为。Fragment 应该用于存储应该对用户可见的应用程序状态,以便用户可以将链接发送给另一个用户以获得相同的应用程序状态。

Fragment 是 URL free 的唯一部分,可以让您透明地实现单页 Web 应用程序(例如可以在您的手机上离线运行)。 因此它不能被发送到服务器。

它可能有效,但这并不意味着它完全按预期工作。如果一个 URL 可以写一个锚名称,那应该是 URL 的正式部分,并随请求发送到服务器。PHP 脚本无法重定向包含定位点名称的 URL,因为从未收到定位点名称。
2021-03-26 23:01:54

散列组件不会传递到服务器,但它广泛用于客户端。具体来说,在单页应用程序中,哈希后面的文本用于将应用程序的状态表示为不同的路由。因此,发生的情况是:当用户通过单击锚标记在页面上的任何位置导航时,遵循对“主页”页面以及包括客户端路由逻辑(如路由器)的附加 js 文件的初始请求,仅更改哈希组件后面的 URL 部分。这可以防止向服务器发出 GET 请求,并且响应此 'onhashchange' 事件,可以根据确切的路由更新单页应用程序的内容。

除了客户端处理之外,还应将完整的 URL 发送到服务器,以防服务器需要对其进行重定向或记录。
2021-03-15 23:01:54