web-dev-qa-db-ja.com

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

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

130
Ricky Supit

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

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

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

  3. ページの読み込み時にクライアント上で、この非表示フィールドの値を確認します。自動生成されたIDが分からないため、含まれているDIVで検索する必要があります。 はい、ここで.ClientIDを使用していくつかのトリックを行うことができますが、このすべてのJavascriptを外部ファイルに入れて汎用的に使用できるため、ラッパーDIVを使用する方が簡単です。

  4. 非表示の入力フィールドに有効な値がある場合、URLハッシュ(window.location.hash again)として設定するか、他のアクションを実行します。

フィールドの選択などを簡単にするためにjQueryを使用しました...結局のところ、値を保存するための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()を適切に使用するようにしてください。

131
Chris

RFC 2396 セクション4.1:

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

(強調を追加)

79

これは、ブラウザがその部分をサーバーに送信しないためです。申し訳ありません。

41
Julien Oster

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

また、戻るボタンとブラウザの履歴を再生する方法も見ることができます at Malcan

7
Artur

実際にGET/POSTでフラグメントを表示しようとしておらず、サーバーサイドコード内にあるURIオブジェクトのその部分にアクセスする方法を実際に知りたいという可能性を除外するために、Uri.Fragmentの下にあります( MSDNドキュメント )。

3
patridge

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