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

Php 为什么URL的哈希部分在服务器端不可用?,php,javascript,url,hash,href,Php,Javascript,Url,Hash,Href,例如,如果我键入URL: 那么在服务器上就没有部分:#MOREURL 是否可以在没有jQuery AJAX的情况下将这些部分发送或获取到服务器? 当URI引用用于 在上执行检索操作 已识别资源,可选 片段标识符,与 URI以十字线(“#”)表示 字符,由附加的 参考资料 之后由用户代理解释 检索操作已停止 已成功完成。因此,它是 不是URI的一部分,但经常使用 与URI结合使用 不,它只对浏览器可用,因此您必须使用Javascript处理它。服务器无法读取它 说明: 基本上,页面URL的哈希组

例如,如果我键入URL:

那么在服务器上就没有部分:#MOREURL

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

当URI引用用于 在上执行检索操作 已识别资源,可选 片段标识符,与 URI以十字线(“#”)表示 字符,由附加的 参考资料 之后由用户代理解释 检索操作已停止 已成功完成。因此,它是 不是URI的一部分,但经常使用 与URI结合使用


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

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

以下是对它的看法:

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


我想扩展关于片段未发送到服务器的原因的答案。因为这是有意的和想要的行为。让我们整体来看URL字符串

/path/to/element?query=string&for=server#?optional=fragment&for=browser

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

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

片段控制浏览器(应用程序)行为。片段应用于 存储用户应可见的应用程序状态,以便用户可以向其他用户发送链接以获得相同的应用程序状态

片段是URL free中唯一可以透明地实现单页web应用程序(例如,可以在手机上脱机运行)的部分。
因此,不能将其发送到服务器。

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

总之,#MOREURL不会发送到服务器?只使用jQuery/AJAX/Javascript方法。jQuery和AJAX与此无关。它只能通过Javascript或其他客户端脚本语言访问。不是服务器端。@user439866:散列几乎就像电话系统中的分机号码。它是“接收器端”。你先拨电话号码,然后拨分机——但分机实际上不是电话号码的一部分(除非是某种直拨系统)——分机是一个“额外”部分,由接收电话系统单独处理。实际上,我不太了解电话系统是如何工作的,所以这个类比可能是不正确的。实际上,您可以
urlencode('#')
将散列值转换为“%23”,然后
urldecode('%23')
转换为“#”,这样它就可以传输到服务器上。这并不是按照OP的要求使用JavaScript,而是使用PHP。如果您也不想使用PHP,可以手动在HTML代码中编写“%23;”-)不,那不可靠。如果散列在查询字符串之后,
%23
将被视为值的一部分,即
?foo=bar%23what
,将导致服务器字面上解释为$foo='bar#what'。@OliverWilliams更好的方法是使用查询参数。在搜索web很长时间后,我终于推断出这种浏览器行为,试图理解为什么PHP无法读取用户输入的完整URL或单击的链接。令人沮丧的是,这在网络上没有更好的记录。这是一个罕见的正确答案。这意味着PHP无法重定向或对包含锚名称的传入URL执行任何其他操作——多么糟糕的设计!回答得好!我一直在试图找出为什么URL中
#
之后的部分没有被发送到服务器。它可能会工作,但这并不意味着它完全按照预期工作。如果一个URL可以用一个锚名称来写,那么它应该是URL的正式部分,并通过请求发送到服务器。PHP脚本无法重定向包含锚名称的URL,因为从未收到锚名称。除客户端处理外,还应向服务器发送完整URL,以防服务器需要重定向或记录。