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

146

我知道在客户端(javascript)中,你可以使用windows.location.hash来访问,但是找不到任何从服务器端访问的方法。 我正在使用asp.net。


你解决了这个问题吗?我有一些带有“#”符号的书签,想在服务器端访问“#”符号后面的文本。 - dotnetcoder
答案解释说,这在服务器上不可用,因为只能由用户代理解释。我试图更改活动选项卡,我试图在服务器端执行此操作。最终我改为在客户端执行。 - Ricky Supit
6个回答

143
我们遇到了这样一个情况:需要在 ASP.Net 的后续提交中保留 URL 哈希值。由于浏览器默认不会将哈希值发送到服务器,因此唯一的方法是使用一些 JavaScript:
  1. 在表单提交时,抓取哈希值 (window.location.hash) 并将其存储在服务器端的隐藏输入字段中。将其放入 id 为 "urlhash" 的 DIV 中,以便稍后可以轻松找到。
  2. 在服务器端,如果需要做一些处理,您可以使用该值。您甚至可以更改它。
  3. 在客户端上页面加载时,检查此隐藏字段的值。您将希望通过包含它的 DIV 找到它,因为自动生成的 ID 是未知的。是的,您可以在此处使用 .ClientID 进行某些技巧处理,但我们发现仅使用包装 DIV 更简单,因为它允许所有此 JavaScript 存储在外部文件中并且以通用方式使用。
  4. 如果隐藏输入字段具有有效值,请将其设置为 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;
}

IsHashValid() 可以检查 "undefined" 或其他你不想处理的内容。

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


4
很好的解决方案,但GET请求怎么办? - Warlock
2
@Chris - 但是当你在不同的浏览器中粘贴URL时(因为它只是一个GET请求),表单提交事件如何被调用? - KrishPrabakar
@Warlock,无论是get还是post都可以工作,因为您将哈希存储在隐藏字段中。 - KMX

87

[RFC 2396][1]第4.1节:

当使用URI引用执行检索操作时,可选的片段标识符由井号(“#”)字符与URI分开,并包含了附加的参考信息在成功完成检索操作之后由用户代理解释。 因此,它不是URI的一部分,但通常与URI一起使用。

(强调添加) [1]: https://www.rfc-editor.org/rfc/rfc2396#section-4


3
我很惊讶。我读过很多关于SPA的东西,但不知道这个。所以浏览器发送了那么多敏感信息,但没有发送哈希值?我认为将来应该这样做...至少作为单独的HTTP头部。这个链接有关:http://www.onebigfluke.com/2015/01/experimentally-verified-why-client-side.html?m=1 - bodrin

44

那是因为浏览器不会将那部分内容传输给服务器,抱歉。


7

可能唯一的选择是在客户端阅读它,然后手动将其传输到服务器(GET/POST/AJAX)。 祝好, 阿图尔

您还可以了解如何使用后退按钮和浏览器历史记录 在Malcan


3

仅仅为了排除你并非真正想要在GET/POST请求中查看片段的可能性,而是想知道如何在服务器端代码中访问URI对象的该部分,它位于Uri.Fragment下 (MSDN文档)。


8
IE8、Chrome和Firefox不会将哈希发送到服务器;因此,如果你在服务器端检查Request.Url.Fragment(如上面的回复所述),则Uri.Fragment始终为空字符串。 - zcrar70

0

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");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接