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

时间:2010-09-08 02:34:26

标签: php javascript url hash href

例如,如果我输入网址:

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

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

可以在没有jQuery AJAX的情况下将这些部分发送到服务器吗?

5 个答案:

答案 0 :(得分:41)

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

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

以下是 Wikipedia 所说的内容:

  

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

答案 1 :(得分:8)

http://tools.ietf.org/html/rfc2396#section-4

  

使用URI引用时   执行检索操作   识别资源,可选   片段标识符,分隔   由交叉阴影线(“#”)的URI   角色,包括额外的   参考信息   由用户代理解释   检索行动已经   成功完成。因此,它是   不是URI的一部分,但经常使用   与URI结合使用。

答案 2 :(得分:4)

由于浏览器默认情况下不向服务器发送哈希值,唯一的方法是使用一些Javascript:

  1. 当表单提交时,抓取哈希值(window.location.hash)并将其存储在服务器端隐藏的输入字段中将其放入ID为“urlhash”的DIV中,以便我们可以轻松找到它后面。

  2. 在服务器上,如果您需要对其执行某些操作,可以使用此值。如果需要,您甚至可以更改它。

  3. 在页面上加载客户端上的时,请检查此隐藏字段的值。您将希望通过其包含的DIV找到它,因为将不知道自动生成的ID。 是的,你可以使用.ClientID做一些技巧但我们发现使用包装器DIV更简单,因为它允许所有这些Javascript存在于外部文件中并以通用方式使用。 < / p>

  4. 如果隐藏的输入字段具有有效值,请将其设置为URL哈希(再次使用window.locaion.hash)和/或执行其他操作。

  5. 我们使用jQuery来简化字段的选择等等...总而言之,它最终只是一些jQuery调用,一个用于保存值,另一个用于恢复它。

    提交前:

    $("form").submit(function() {
      $("input", "#urlhash").val(window.location.hash);
    });
    

    页面加载:

    var hashVal = $("input", "#urlhash").val();
    if (IsHashValid(hashVal)) {
      window.location.hash = hashVal;
    }
    

    IsHashValid()可以检查“未定义”或其他您不想处理的事情。

    另外,当然要确保适当地使用$(document).ready()。

答案 3 :(得分:4)

我想对 WHY 片段未发送到服务器的原因进行扩展。因为这是有意和理想的行为。我们来看整个URL字符串。

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

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

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

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

片段是URL的唯一部分,您可以透明地实现单页Web应用程序(例如,可以在您的移动电话上脱机运行)。 因此不得将其发送到服务器。

答案 4 :(得分:0)

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