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

How to get Url Hash (#) from server side

提问人:Ricky Supit 提问时间:11/25/2008 最后编辑:showdevRicky Supit 更新时间:6/6/2021 访问量:118981

问:

我知道在客户端(javascript)上,您可以使用windows.location.hash,但无论如何都找不到从服务器端访问。我正在使用 asp.net。

URL 服务器端 片段标识符

评论

0赞 dotnetcoder 2/26/2009
你有没有办法解决这个问题,我在 url 中有带有 has 的书签,想在服务器端哈希后访问文本?
0赞 Ricky Supit 3/3/2009
答案解释说,这在服务器上是不可用的,因为只能由用户代理解释。我试图更改活动选项卡,我试图在服务器端这样做。我最终在客户端上做了这件事。
0赞 Peter O. 5/21/2017
我可以在服务器端应用程序(PHP、Ruby、Python 等)上读取 URL 的哈希部分吗?

答:

44赞 Julien Oster 11/25/2008 #1

那是因为浏览器没有将该部分传输到服务器,对不起。

87赞 Mauricio Scheffer 11/26/2008 #2

[RFC 2396][1] 第 4.1 节:

当 URI 引用用于对 identified resource,可选的片段标识符,与 通过交叉影线 (“#”) 字符的 URI 由附加的 用户代理在 检索操作已成功完成。因此,事实并非如此 URI 的一部分,但通常与 URI 结合使用。

(着重号后加) [1]:https://www.rfc-editor.org/rfc/rfc2396#section-4

评论

3赞 bodrin 2/13/2015
我很惊讶。我读过很多关于SPA的文章,但不知道。所以浏览器发送了这么多敏感信息,但没有发送哈希值??我认为它应该在未来......至少作为单独的 HTTP 标头。这与:onebigfluke.com/2015/01/...
7赞 Artur 12/30/2008 #3

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

您还可以在 Malcan 上看到如何使用后退按钮和浏览器历史记录进行游戏

3赞 patridge 12/30/2008 #4

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

评论

8赞 zcrar70 5/4/2011
IE8、Chrome 和 Firefox 都不会将哈希值发送到服务器;因此,如果您检查 Request.Url.Fragment 服务器端(根据上面的回复),则 Uri.Fragment 始终为空字符串。
143赞 Chris 10/19/2009 #5

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

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

  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赞 Warlock 6/1/2013
很棒的解决方案,但是 GET 请求呢?
2赞 KrishPrabakar 7/15/2013
@Chris - 但是,当您简单地将 URL 粘贴到不同的浏览器中时(因为它只是一个 GET 请求)时,如何调用表单提交事件?
0赞 KMX 1/14/2015
@Warlock,无论获取/发布如何,它都可以工作,因为您将哈希存储在隐藏字段中。
0赞 webaholik 3/10/2016 #6

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