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


133

我知道可以在客户端(javascript)上使用windows.location.hash,但无论如何都无法从服务器端进行访问。


您是否有解决此问题的方法,我在URL中具有带有的书签,并希望在服务器端哈希后访问文本?
dotnetcoder

答案说明这在服务器上不可用,因为仅由用户代理解释。我正在尝试更改活动选项卡,而我正在尝试在服务器端执行此操作。我最终在客户端上完成了它。
Ricky Supit 09年

Answers:


134

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

  1. 提交表单后,抓取哈希(window.location.hash)并将其存储在服务器端隐藏的输入字段中,然后将其放入ID为“ urlhash” 的DIV中,以便稍后使用。

  2. 在服务器上,如果需要使用此值,则可以使用该值。您甚至可以根据需要更改它。

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

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

我们使用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请求呢?
术士

2
@Chris-但是当您简单地将URL粘贴到其他浏览器中(因为这只是一个GET请求)时,如何调用表单提交事件?
KrishPrabakar

@Warlock,无论获取/发布,它都将起作用,因为您将哈希存储在隐藏字段中。
KMX

83

RFC 2396第4.1节:

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

(添加了重点)


3
我很惊讶。我已经阅读了很多有关SPA的文章,但并不知道。因此,浏览器发送了太多敏感信息,但没有发送哈希?我认为它应该在将来..至少作为一个单独的HTTP标头。这是相关的:onebigfluke.com/2015/01/…–
bodrin


7

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

您可能还会在Malcan上看到如何使用后退按钮和浏览器历史记录 进行播放


3

只是为了排除这种可能性,您实际上并没有试图在GET / POST上看到该片段,而是想知道如何访问服务器端代码中包含的URI对象的该部分,它位于Uri.Fragment下。 (MSDN文档)。


8
IE8,Chrome和Firefox都不会将哈希发送到服务器。如此,Uri.Fragment始终是一个空字符串,如果你检查Request.Url.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");
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.