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

Posted

技术标签:

【中文标题】如何从服务器端获取 Url Hash (#)【英文标题】:How to get Url Hash (#) from server side 【发布时间】:2012-09-21 12:03:41 【问题描述】:

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

【问题讨论】:

你有办法解决这个问题吗?我的 url 中有带有 has 的书签,想在服务器端哈希后访问文本? 答案说明这在服务器上无效,因为仅由用户代理解释。我试图更改活动选项卡,我试图在服务器端这样做。我最终改为在客户端执行此操作。 Can I read the hash portion of the URL on my server-side application (php, Ruby, Python, etc.)?的可能重复 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

    如果隐藏的输入字段具有有效值,请将其设置为 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()

【讨论】:

很好的解决方案,但是 GET 请求呢? @Chris - 但是当您简单地将 URL 粘贴到不同的浏览器(因为它只是一个 GET 请求)时,如何调用表单提交事件? @Warlock,无论获取/发布它都会起作用,因为您将哈希存储在隐藏字段中。【参考方案3】:

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

【讨论】:

IE8、Chrome 和 Firefox 都不会将哈希发送到服务器;因此,如果您检查 Request.Url.Fragment 服务器端(根据上面的回复),Uri.Fragment 始终是一个空字符串。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

[RFC 2396][1] 第 4.1 节:

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

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

【讨论】:

我很惊讶。我已经阅读了很多关于 SPA 的内容,但我并不知道。所以浏览器发送了这么多敏感信息而不是哈希?我认为它应该在未来......至少作为一个单独的 HTTP 标头。这是相关的:onebigfluke.com/2015/01/…【参考方案6】:

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

【讨论】:

以上是关于如何从服务器端获取 Url Hash (#)的主要内容,如果未能解决你的问题,请参考以下文章

路由 前后端渲染 url hash 和 html5 history

发送重定向时强制浏览器从 URL 中删除#hash

如何从服务器端 express/mongo/mongoose 中的 URL,客户端的 axios/react/redux 中获取参数 ID

如何从URL获取片段标识符(hash#之后的值)?

前端路由 VS 后端路由

如何从 url 中获取图片