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

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

115454 次浏览

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

[ RFC 2396][1]第4.1节:

当 URI 引用用于对 标识的资源,可选的片段标识符,从 通过一个交叉线(“ #”)字符的 URI,包含额外的 引用信息 < strong > 后由用户代理解释 检索操作已成功完成 URI 的一部分,但通常与 URI 结合使用。

(加重语气) 返回文章页面【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟科普】【一分钟 https://www.rfc-editor.org/rfc/rfc2396#section-4】

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

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

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

我们遇到了这样一种情况: 我们需要跨 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()

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