Cara mendapatkan Url Hash (#) dari sisi server

133

Saya tahu di sisi klien (javascript) Anda dapat menggunakan windows.location.hash tetapi tidak dapat menemukannya untuk mengakses dari sisi server.

Ricky Supit
sumber
apakah Anda mendapatkan cara selain masalah ini, saya memiliki bookmark dengan di url dan ingin mengakses teks setelah hash di sisi server?
dotnetcoder
Jawabannya menjelaskan bahwa ini tidak tersedia di server, karena hanya ditafsirkan oleh agen pengguna. Saya mencoba mengubah tab aktif, yang saya coba lakukan di sisi server. Saya akhirnya melakukannya di sisi klien.
Ricky Supit

Jawaban:

134

Kami memiliki situasi di mana kami harus mempertahankan hash URL di seluruh punggung posting ASP.Net. Karena browser tidak mengirimkan hash ke server secara default, satu-satunya cara untuk melakukannya adalah dengan menggunakan beberapa Javascript:

  1. Saat formulir dikirimkan, ambil hash ( window.location.hash) dan simpan di bidang input tersembunyi sisi server Masukkan ini ke dalam DIV dengan id " urlhash" sehingga kita bisa menemukannya dengan mudah nanti.

  2. Di server Anda dapat menggunakan nilai ini jika Anda perlu melakukan sesuatu dengannya. Anda bahkan dapat mengubahnya jika perlu.

  3. Pada pemuatan laman pada klien , periksa nilai bidang tersembunyi ini. Anda akan ingin menemukannya dengan DIV yang terkandung di dalamnya karena ID yang dibuat secara otomatis tidak akan diketahui. Ya, Anda dapat melakukan beberapa tipuan di sini dengan .ClientID tetapi kami merasa lebih mudah untuk hanya menggunakan DIV pembungkus karena memungkinkan semua Javascript ini untuk hidup dalam file eksternal dan digunakan secara umum.

  4. Jika bidang input tersembunyi memiliki nilai yang valid, tetapkan itu sebagai hash URL ( window.location.hash again) dan / atau lakukan tindakan lain.

Kami menggunakan jQuery untuk menyederhanakan pemilihan bidang, dll ... semuanya akhirnya menjadi beberapa panggilan jQuery, satu untuk menyimpan nilai, dan yang lain untuk mengembalikannya.

Sebelum mengirim:

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

Pemuatan halaman:

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid()dapat memeriksa " undefined" atau hal-hal lain yang tidak ingin Anda tangani.

Juga, pastikan Anda menggunakannya dengan $(document).ready()tepat, tentu saja.

Chris
sumber
4
Solusi hebat, tapi bagaimana dengan permintaan GET?
Warlock
2
@ Chris - Tapi bagaimana acara pengiriman formulir dipanggil ketika Anda cukup menempelkan URL di browser yang berbeda (karena itu hanya permintaan GET)?
KrishPrabakar
@ Warlock, terlepas dari mendapatkan / memposting itu akan berfungsi karena Anda menyimpan hash di bidang tersembunyi.
KMX
83

RFC 2396 bagian 4.1:

Ketika referensi URI digunakan untuk melakukan tindakan pengambilan pada sumber daya yang diidentifikasi, pengidentifikasi fragmen opsional, dipisahkan dari URI oleh karakter crosshatch ("#"), terdiri dari informasi referensi tambahan yang akan ditafsirkan oleh agen pengguna setelah pengambilan. tindakan telah berhasil diselesaikan . Karena itu, ini bukan bagian dari URI, tetapi sering digunakan bersama dengan URI.

(penekanan ditambahkan)

Mauricio Scheffer
sumber
3
Aku terkejut. Saya telah membaca banyak tentang SPA dan tidak tahu itu. Jadi browser mengirimkan begitu banyak informasi sensitif tetapi bukan hash ?? Saya pikir itu harus ke masa depan .. setidaknya sebagai header HTTP terpisah. Ini terkait: onebigfluke.com/2015/01/...
bodrin
42

Itu karena browser tidak mengirimkan bagian itu ke server, maaf.

Julien Oster
sumber
7

Mungkin satu-satunya pilihan adalah membacanya di sisi klien dan mentransfernya secara manual ke server (GET / POST / AJAX). Salam Artur

Anda juga dapat melihat cara bermain dengan tombol kembali dan riwayat browser di Malcan


sumber
3

Hanya untuk mengesampingkan kemungkinan Anda tidak benar-benar mencoba melihat fragmen pada GET / POST dan benar-benar ingin tahu cara mengakses bagian dari objek URI yang Anda miliki dalam kode sisi server Anda, itu berada di bawah Uri.Fragment ( MSDN docs ).

patridge
sumber
8
IE8, Chrome dan Firefox all tidak akan mengirim hash ke server; jadi, Uri.Fragment selalu berupa string kosong jika Anda memeriksa sisi server Request.Url.Fragment (sesuai dengan balasan di atas.)
zcrar70
0

Solusi yang mungkin untuk permintaan GET:

Format Tautan Baru: http://example.com/yourDirectory?hash=video01

Panggil fungsi ini ke atas pengontrol atau 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");
    }
}
webaholik
sumber