Cách nhận Url Hash (#) từ phía máy chủ


133

Tôi biết về phía máy khách (javascript) bạn có thể sử dụng windows.location.hash nhưng dù sao cũng không thể tìm thấy để truy cập từ phía máy chủ.


Bạn có nhận được cách giải quyết vấn đề này không, tôi có dấu trang có trong url và muốn truy cập văn bản sau khi băm ở phía máy chủ?
dotnetcoder

Các câu trả lời giải thích rằng điều này không có sẵn trên máy chủ, bởi vì chỉ được giải thích bởi tác nhân người dùng. Tôi đã cố gắng thay đổi tab hoạt động, mà tôi đã cố gắng làm điều đó ở phía máy chủ. Tôi cuối cùng đã làm điều đó về phía khách hàng thay thế.
Ricky Supit

Câu trả lời:


134

Chúng tôi đã có một tình huống cần duy trì hàm băm URL trên các bài đăng của ASP.Net. Vì trình duyệt không gửi băm đến máy chủ theo mặc định, cách duy nhất để làm điều đó là sử dụng một số Javascript:

  1. Khi biểu mẫu gửi, hãy lấy hàm băm ( window.location.hash) và lưu trữ nó trong trường nhập liệu ẩn phía máy chủ Đặt cái này vào DIV với id " urlhash" để chúng ta có thể tìm thấy nó dễ dàng sau này.

  2. Trên máy chủ, bạn có thể sử dụng giá trị này nếu bạn cần làm gì đó với nó. Bạn thậm chí có thể thay đổi nó nếu bạn cần.

  3. Khi tải trang trên máy khách , hãy kiểm tra giá trị của trường ẩn này. Bạn sẽ muốn tìm nó bởi DIV, nó được chứa trong ID tự động được tạo sẽ không được biết đến. Có, bạn có thể thực hiện một số thủ thuật ở đây với .ClientID nhưng chúng tôi thấy đơn giản hơn khi chỉ sử dụng trình bao bọc DIV vì nó cho phép tất cả Javascript này sống trong một tệp bên ngoài và được sử dụng theo kiểu chung.

  4. Nếu trường đầu vào ẩn có giá trị hợp lệ, hãy đặt đó là hàm băm URL ( window.location.hash again) và / hoặc thực hiện các hành động khác.

Chúng tôi đã sử dụng jQuery để đơn giản hóa việc chọn trường, v.v ... tất cả cuối cùng chỉ là một vài lệnh gọi jQuery, một để lưu giá trị và một số khác để khôi phục lại nó.

Trước khi gửi:

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

Khi tải trang:

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

IsHashValid()có thể kiểm tra " undefined" hoặc những thứ khác mà bạn không muốn xử lý.

Ngoài ra, chắc chắn rằng bạn sử dụng $(document).ready()một cách thích hợp, tất nhiên.


4
Giải pháp tuyệt vời, nhưng những gì về yêu cầu GET?
Warlock

2
@Chris - Nhưng làm thế nào để gửi sự kiện biểu mẫu được gọi khi bạn chỉ cần dán URL vào một trình duyệt khác (vì đó chỉ là yêu cầu NHẬN)?
KrishPrabakar

@Warlock, bất kể get / post nó sẽ hoạt động vì bạn đang lưu trữ hàm băm trong một trường ẩn.
KMX

83

RFC 2396 phần 4.1:

Khi tham chiếu URI được sử dụng để thực hiện hành động truy xuất trên tài nguyên đã xác định, số nhận dạng phân đoạn tùy chọn, được phân tách khỏi URI bằng ký tự dấu chéo ("#"), bao gồm thông tin tham chiếu bổ sung được tác nhân người dùng giải thích sau khi truy xuất hành động đã được hoàn thành . Như vậy, nó không phải là một phần của URI, nhưng thường được sử dụng cùng với URI.

(nhấn mạnh thêm)


3
Tôi ngạc nhiên. Tôi đã đọc rất nhiều về SPA và không biết điều đó. Vì vậy, trình duyệt gửi rất nhiều thông tin nhạy cảm nhưng không phải là băm ?? Tôi nghĩ rằng nó sẽ đi vào tương lai .. ít nhất là một tiêu đề HTTP riêng biệt. Điều này có liên quan: onebigfluke.com/2015/01/ trên
bodrin 12/2/2015

42

Đó là vì trình duyệt không truyền phần đó đến máy chủ, xin lỗi.


7

Có lẽ lựa chọn duy nhất là đọc nó ở phía máy khách và chuyển nó thủ công đến máy chủ (GET / POST / AJAX). Trân trọng

Bạn cũng có thể xem cách chơi với nút quay lại và lịch sử trình duyệt tại Malcan


3

Chỉ cần loại trừ khả năng bạn không thực sự cố gắng nhìn thấy đoạn trên GET / POST và thực sự muốn biết cách truy cập phần đó của đối tượng URI mà bạn có trong mã phía máy chủ của mình, nó nằm trong Uri.Fragment (Tài liệu MSDN ).


8
IE8, Chrome và Firefox đều sẽ không gửi băm đến máy chủ; vì vậy, Uri.Fragment luôn là một chuỗi rỗng nếu bạn kiểm tra phía máy chủ Request.Url.Fragment (theo các câu trả lời ở trên.)
zcrar70

0

Giải pháp có thể cho các yêu cầu GET:

Định dạng liên kết mới: http://example.com/yourDirectory?hash=video01

Gọi hàm này về phía trên của bộ điều khiển hoặc 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");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.