Sunucu tarafından URL Karma (#) alma


133

Istemci tarafında (javascript) windowss.location.hash kullanabilirsiniz biliyorum ama yine de sunucu tarafından erişmek için bulamadık.


Bu sorundan önce bir yol aldınız mı, url'de yer imleri var ve sunucu tarafında karmadan sonra metne erişmek istiyorum?
dotnetcoder

Yanıtlar, bunun sunucuda bulunmadığını açıklar, çünkü yalnızca kullanıcı aracısı tarafından yorumlanır. Sunucu tarafında yapmaya çalıştığım etkin sekmeyi değiştirmeye çalışıyordum. Bunun yerine müşteri tarafında yaptım.
Ricky Supit

Yanıtlar:


134

ASP.Net posta desteklerinde URL karmasını devam ettirmemiz gereken bir durum vardı. Tarayıcı karmayı varsayılan olarak sunucuya göndermediğinden, bunu yapmanın tek yolu bazı Javascript kullanmaktır:

  1. Form gönderildiğinde, hash ( window.location.hash) öğesini yakalayın ve sunucu tarafı gizli giriş alanına kaydedin urlhash.

  2. Sunucuda , bu değeri bir şey yapmanız gerekiyorsa kullanabilirsiniz. Gerekirse bile değiştirebilirsiniz.

  3. İstemciye sayfa yüklendiğinde , bu gizli alanın değerini kontrol edin. Otomatik oluşturulan kimlik bilinmeyeceğinden, içinde bulunduğu DIV tarafından bulmak isteyeceksiniz. Evet, burada .ClientID ile biraz hile yapabilirsiniz, ancak tüm bu Javascript'in harici bir dosyada yaşamasına ve genel bir şekilde kullanılmasına izin verdiği için sadece sarmalayıcı DIV'yi kullanmayı daha basit bulduk.

  4. Gizli giriş alanı geçerli bir değere sahipse, bunu URL karması ( window.location.hash again) olarak ayarlayın ve / veya diğer işlemleri gerçekleştirin.

Alan seçimini kolaylaştırmak için jQuery, vb ... kullandık. Sonuç olarak, birkaç jQuery çağrısı, biri değeri kaydetmek ve diğeri geri yüklemek için kullanılır.

Göndermeden önce:

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

Sayfa yüklenirken:

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

IsHashValid()" undefined" veya işlemek istemediğiniz diğer şeyleri kontrol edebilir .

Ayrıca, $(document).ready()elbette uygun şekilde kullandığınızdan emin olun .


4
Harika bir çözüm, ama GET talebi ne olacak?
Warlock

2
@Chris - Ancak, URL'yi farklı bir tarayıcıya yapıştırdığınızda form gönderme olayı nasıl çağrılır (çünkü bu yalnızca bir GET isteğidir)?
KrishPrabakar

@Warlock, get / post ne olursa olsun, hash'ı gizli bir alanda sakladığınız için işe yarayacaktır.
KMX

83

RFC 2396 bölüm 4.1:

Tanımlanan kaynak üzerinde bir alım eylemi gerçekleştirmek için bir URI referansı kullanıldığında, çapraz tarama ("#") karakteriyle URI'dan ayrılan isteğe bağlı parça tanımlayıcısı, alımdan sonra kullanıcı aracısı tarafından yorumlanacak ek referans bilgilerinden oluşur işlem başarıyla tamamlandı . Bu nedenle, bir URI'nin parçası değildir, ancak genellikle bir URI ile birlikte kullanılır.

(vurgu eklenmiştir)


3
Şaşırdım. SPA hakkında çok şey okudum ve bunu bilmiyordum. Böylece tarayıcı çok hassas bilgiler gönderir ama karma değil ?? Bence geleceğe .. en azından ayrı bir HTTP başlığı olarak. Bu, ilgili: onebigfluke.com/2015/01/…
bodrin


7

Muhtemelen tek seçenek onu istemci tarafında okumak ve manuel olarak sunucuya aktarmaktır (GET / POST / AJAX). Saygılarımızla Artur

Malcan'da geri düğmesi ve tarayıcı geçmişi ile nasıl oynanacağını da görebilirsiniz.


3

Sadece bir GET / POST üzerindeki parçayı görmeye çalışmadığınızı ve aslında sunucu tarafı kodunuzdaki bir URI nesnesinin bu kısmına nasıl erişeceğinizi bilmek istemiyorsanız, Uri'nin altındadır. ( MSDN belgeleri ).


8
IE8, Chrome ve Firefox, karmayı sunucuya göndermez; bu nedenle, Request.Url.Fragment sunucu tarafını incelerseniz Uri.Fragment her zaman boş bir dizedir (yukarıdaki yanıtlara göre.)
zcrar70

0

GET istekleri için olası çözüm:

Yeni Bağlantı biçimi: http://example.com/yourDirectory?hash=video01

Bu işlevi denetleyicinin üstüne doğru çağırın veya 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");
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.