如何从服务器端获取Url哈希(#)

如何从服务器端获取Url哈希(#),url,server-side,fragment-identifier,Url,Server Side,Fragment Identifier,我知道在客户端(javascript)可以使用windows.location.hash,但无法从服务器端找到访问权限。我正在使用asp.net。这是因为浏览器没有将该部分传输到服务器,很抱歉。第4.1节: 当URI引用用于在上执行检索操作时 标识的资源,可选的片段标识符,与 URI由交叉线(“#”)字符组成,由附加的 参考信息由用户代理在 检索操作已成功完成。事实并非如此 URI的一部分,但通常与URI结合使用 (重点补充)可能唯一的选择是在客户端读取并手动将其传输到服务器(GET/POST/

我知道在客户端(javascript)可以使用windows.location.hash,但无法从服务器端找到访问权限。我正在使用asp.net。

这是因为浏览器没有将该部分传输到服务器,很抱歉。

第4.1节:

当URI引用用于在上执行检索操作时 标识的资源,可选的片段标识符,与 URI由交叉线(“#”)字符组成,由附加的 参考信息由用户代理在 检索操作已成功完成。事实并非如此 URI的一部分,但通常与URI结合使用


(重点补充)

可能唯一的选择是在客户端读取并手动将其传输到服务器(GET/POST/AJAX)。 当做 阿图尔

您还可以看到如何播放后退按钮和浏览器历史记录

为了排除这种可能性,您实际上没有试图在GET/POST上查看片段,并且确实想知道如何访问服务器端代码中的URI对象的这一部分,它位于URI.fragment()下。

我们遇到了一种情况,需要在ASP.Net POST back上持久化URL哈希。由于默认情况下浏览器不会将哈希发送到服务器,因此唯一的方法是使用一些Javascript:

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

  • 在服务器上如果需要使用该值,可以使用该值。如果需要,你甚至可以改变它

  • 在客户端的页面加载中,检查此隐藏字段的值。您将希望通过它所包含的DIV来查找它,因为自动生成的ID是未知的。是的,您可以在这里使用.ClientID进行一些技巧,但我们发现只使用包装器DIV更简单,因为它允许所有这些Javascript都存在于外部文件中,并以通用方式使用

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

  • 我们使用jQuery来简化字段的选择,等等。。。总之,它最终只需要几个jQuery调用,一个用于保存值,另一个用于恢复值

    提交前:

    $("form").submit(function() {
      $("input", "#urlhash").val(window.location.hash);
    });
    
    var hashVal = $("input", "#urlhash").val();
    if (IsHashValid(hashVal)) {
      window.location.hash = hashVal;
    }
    
    页面加载:

    $("form").submit(function() {
      $("input", "#urlhash").val(window.location.hash);
    });
    
    var hashVal = $("input", "#urlhash").val();
    if (IsHashValid(hashVal)) {
      window.location.hash = hashVal;
    }
    
    IsHashValid()
    可以检查“
    未定义的
    ”或其他您不想处理的内容


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

    GET请求的可能解决方案:

    新链接格式:
    http://example.com/yourDirectory?hash=video01

    在控制器顶部或
    http://example.com/yourDirectory/index.php

    function redirect()
    {
        if (!empty($_GET['hash'])) {
            /** Sanitize & Validate $_GET['hash']
                   If valid return string
                   If invalid: return empty or false
            ******************************************************/
            $validHash = sanitizeAndValidateHashFunction($_GET['hash']);
            if (!empty($validHash)) {
                $url = './#' . $validHash;
            } else {
                $url = '/your404page.php';
            }
            header("Location: $url");
        }
    }
    

    你有办法解决这个问题吗?我在url中有带有的书签,想在服务器端访问散列后的文本?答案解释说,这在服务器上是无效的,因为它只能由用户代理进行解释。我试图更改活动选项卡,我试图在服务器端这样做。我最终在客户端完成了这项工作,IE8、Chrome和Firefox的可能副本都不会将哈希发送到服务器;因此,如果您检查Request.Url.Fragment服务器端(根据上面的回复),Uri.Fragment始终是空字符串。这是一个很好的解决方案,但GET-Request是什么?@Chris-但是当您将Url粘贴到不同的浏览器中(因为它只是一个GET-Request)时,表单提交事件是如何调用的呢?@Warlock,不管get/post如何,它都会工作,因为您将散列存储在一个隐藏字段中。我很惊讶。我读过很多关于水疗的书,但我并不知道。所以浏览器发送了如此多的敏感信息,而不是散列??我认为应该把它推广到未来。。至少作为一个单独的HTTP头。这与: