サーバー側からURLハッシュ(#)を取得する方法


133

クライアント側(javascript)ではwindows.location.hashを使用できますが、サーバー側からアクセスする方法が見つかりませんでした。


あなたはこの問題を回避する方法を手に入れましたか、私はブックマークをURLに持っていて、サーバー側でハッシュ後にテキストにアクセスしたいですか?
dotnetcoder 2009

回答は、これはユーザーエージェントによってのみ解釈されるため、サーバーでは使用できないことを説明しています。私はサーバー側でそれをしようとしていたアクティブなタブを変更しようとしていました。代わりにクライアント側でそれを行うことになりました。
Ricky Supit 2009年

回答:


134

ASP.Netポストバック全体でURLハッシュを永続化する必要がある状況がありました。ブラウザーはデフォルトでハッシュをサーバーに送信しないため、それを行う唯一の方法はいくつかのJavaScriptを使用することです。

  1. フォームが送信されたら、ハッシュ(window.location.hash)を取得してサーバー側の非表示の入力フィールドに保存しますurlhash。これを「」のIDでDIVに配置すると、後で簡単に見つけることができます。

  2. サーバーで何かをする必要がある場合は、この値を使用できます。必要に応じて変更することもできます。

  3. クライアントでのページの読み込み時に、このこの非表示フィールドの値を確認します。自動生成されたIDは認識されないため、含まれているDIVで検索する必要があります。はい、ここで.ClientIDを使用していくつかのトリックを実行できますが、ラッパーDIVを使用する方が簡単です。この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 2013

@Warlockは、get / postに関係なく、ハッシュを非表示フィールドに格納しているため機能します。
KMX

83

RFC 2396セクション4.1:

URI参照を使用して識別されたリソースで検索アクションを実行する場合、オプションのフラグメント識別子は、ハッチング(「#」)文字でURIから分離され、検索後にユーザーエージェントによって解釈される追加の参照情報で構成されますアクションは正常に完了しました。そのため、URIの一部ではありませんが、URIと組み合わせて使用​​されることがよくあります。

(強調を追加)


3
びっくりしました。私はSPAについてたくさん読んで、それを知りませんでした。したがって、ブラウザは非常に多くの機密情報を送信しますが、ハッシュは送信しませんか?私はそれが将来..少なくとも別個のHTTPヘッダーとしてあるべきだと思います。これは関連していますonebigfluke.com/2015/01/...
bodrin


7

おそらく唯一の選択肢は、クライアント側でそれを読み取り、手動でサーバーに転送することです(GET / POST / AJAX)。よろしく

マルカンで戻るボタンとブラウザの履歴遊ぶ方法も見ることができます


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");
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.