Nút Quay lại trong trình duyệt web hoạt động như thế nào?


84

Tôi đã tìm kiếm trên Web về câu hỏi này nhưng không tìm thấy gì:

Logic của nút quay lại là gì? Điều gì đang xảy ra khi chúng ta nhấn nút quay lại trên trình duyệt Web?

Tôi thực sự muốn hiểu thêm về điều đó.

Cảm ơn bạn.


14
Nó có gửi lại yêu cầu không hay nó tải trang từ bộ nhớ cache cục bộ? Các cookie được tạo trong phản hồi đầu tiên có được gửi khi bạn phản hồi không? vv
Jimmy

Câu trả lời:


99

Trình duyệt web của bạn giữ một ngăn xếp (hoặc danh sách, nếu bạn muốn) các trang web mà bạn đã truy cập trong cửa sổ đó. Giả sử trang chủ của bạn là google.com và từ đó bạn truy cập một vài trang web khác: youtube.com, yahoo.com và cnn.com. Khi truy cập trang cuối cùng, danh sách sẽ giống như sau:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                            ^
                                            |
                                       current page

Khi bạn nhấn nút Quay lại, trình duyệt sẽ đưa bạn trở lại trang trước trong danh sách, như sau:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                ^
                                |
                           current page

Tại thời điểm này, bạn có thể nhấn Quay lại một lần nữa để đưa bạn đến youtube.com hoặc bạn có thể nhấn Chuyển tiếp để đưa bạn đến cnn.com một lần nữa. Giả sử bạn nhấn Quay lại lần thứ hai:

google.com -> youtube.com -> yahoo.com -> cnn.com
                   ^
                   |
              current page

Nếu bây giờ bạn truy cập, chẳng hạn, abc.com, danh sách sẽ thay đổi thành như thế này:

google.com -> youtube.com -> abc.com
                               ^
                               |
                          current page

Lưu ý rằng cả yahoo.com và cnn.com đều không có trong danh sách. Điều này là do bạn đã đi một con đường mới. Trình duyệt chỉ duy trì danh sách các trang bạn đã truy cập để đến vị trí hiện tại chứ không phải lịch sử của mọi trang bạn đã từng đến. Trình duyệt cũng không biết gì về cấu trúc của trang web bạn đang truy cập, điều này có thể dẫn đến một số hành vi đáng ngạc nhiên.

Bạn đang ở trên một trang web mua sắm (ví dụ ngắn gọn là ne.com) có các danh mục và danh mục phụ của sản phẩm để duyệt qua. Nhà thiết kế trang web đã chu đáo cung cấp các đường dẫn gần đầu cửa sổ để cho phép bạn điều hướng qua các danh mục. Bạn bắt đầu từ trang trên cùng của trang web, nhấp vào Phần cứng, sau đó nhấp vào Bộ nhớ. Danh sách bây giờ trông như thế này:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
                                           ^
                                           |
                                      current page

Bạn muốn quay lại danh mục Phần cứng, vì vậy bạn sử dụng breadcrumbs để chuyển đến danh mục chính thay vì sử dụng nút Quay lại. Bây giờ danh sách trình duyệt trông như thế này:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                                          ^
                                                          |
                                                     current page

Theo cấu trúc trang web, bạn đã lùi lại (tăng một cấp), nhưng với trình duyệt, bạn đã tiến lên vì bạn đã nhấp vào một liên kết. Bất cứ khi nào bạn nhấp vào một liên kết hoặc nhập một URL vào thanh địa chỉ, bạn sẽ tiếp tục theo như trình duyệt có liên quan, cho dù liên kết đó có đưa bạn đến trang mà bạn đã từng đến hay không.

Cuối cùng, bạn muốn quay lại trang web chính (ne.com). Bạn có thể sử dụng breadcrumbs, nhưng lần này bạn nhấp vào nút Quay lại - rõ ràng là nó sẽ nâng bạn lên một cấp, phải không? Nhưng nó sẽ đưa bạn đến đâu?

Ban đầu, nó khiến nhiều người dùng bối rối (bao gồm cả bản thân tôi, khi tôi tình cờ làm chính xác điều này) rằng nó khiến bạn "xuống" một cấp độ, quay trở lại danh mục Bộ nhớ. Nhìn vào danh sách các trang, thật dễ dàng hiểu tại sao:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                            ^
                                            |
                                       current page

Để quay lại trang chính chỉ bằng cách sử dụng nút Quay lại sẽ cần thêm hai lần nhấn nữa, đưa bạn "quay lại" danh mục Phần cứng và cuối cùng là trang chính. Đối với các lập trình viên chúng tôi có vẻ quá rõ ràng về những gì đang xảy ra, nhưng điều đó khiến người dùng thường xuyên phải ngạc nhiên vì họ không nhận ra rằng trình duyệt không biết gì về cấu trúc phân cấp của bất kỳ trang web nào mà họ xuất hiện.

Sẽ thật tuyệt nếu các trình duyệt cho phép các nhà thiết kế trang web lập trình nút Quay lại để làm điều hiển nhiên (đưa bạn lên một cấp độ) thay vì bất cứ điều gì hiện tại?

Chỉnh sửa: Một người bình luận đã hỏi liệu trình duyệt có tải lại trang hay chỉ hiển thị trang ra khỏi bộ nhớ cache cục bộ.

Câu trả lơi con phụ thuộc vao nhiêu thư. Các nhà thiết kế trang web có thể chỉ định liệu trình duyệt có nên lưu trang vào bộ nhớ cache hay không. Đối với các trang được đặt là không được lưu trong bộ nhớ cache, trình duyệt sẽ tải lại trang từ máy chủ khi bạn nhấn Quay lại, như thể đây là lần đầu tiên bạn truy cập trang đó. Đối với các trang được lưu trong bộ nhớ cache, trình duyệt sẽ hiển thị nó ra khỏi bộ nhớ cache, nhanh hơn nhiều.


5
Khi trình duyệt đang tìm kiếm trong bộ nhớ cache, nó có kiểm tra ngày hết hạn trong tiêu đề của phản hồi máy chủ không? Tôi đoán rằng nếu trang đã hết hạn, trình duyệt sẽ gửi lại cùng một truy vấn, phải không? Lấy và đăng có được xử lý theo cùng một cách đối với nút quay lại không? Cảm ơn bạn cho câu trả lời tuyệt vời của bạn.
Pierre Thibault

5
Câu hỏi đầu tiên: vâng, đúng vậy. Nếu trang đã hết hạn, trình duyệt sẽ yêu cầu lại trang bằng cách sử dụng cùng một URL và dữ liệu ĐĂNG. Nhưng đối với các hoạt động POST, hầu hết các trình duyệt hỏi người dùng xem họ có muốn gửi lại nó hay không. Tôi đoán là việc gửi lại dữ liệu POST có thể dẫn đến các bài đăng trùng lặp, giao dịch trùng lặp, v.v. Đó là tùy thuộc vào nhà thiết kế trang web để ngăn điều đó xảy ra.
Barry Brown

Có, nhưng trong trường hợp POST, tôi nghĩ rằng trình duyệt sẽ chỉ hỏi trong trường hợp POST đã hết hạn. Tôi nói đúng chứ? Bởi vì khi tôi đang phát triển với ASP.net, nút quay lại đã đăng lại máy chủ mà không cần hỏi.
Pierre Thibault

Có lẽ phụ thuộc vào trình duyệt. Trình duyệt của tôi (Safari) luôn hỏi - ít nhất tôi nghĩ nó luôn hỏi.
Barry Brown

Tôi đã sử dụng Safari. Nó không phải lúc nào cũng hỏi. Nó phải tuân theo logic mà tôi đã mô tả.
Pierre Thibault

5

Tôi thích nghĩ về nó như là đưa ra lại yêu cầu cuối cùng của tôi. Nếu bạn thực hiện một GET đơn giản, nó có thể sẽ trả về giống như lần trước (trừ nội dung động). Nếu bạn đã thực hiện ĐĂNG, bạn sẽ gửi lại biểu mẫu (sau khi xác nhận) đến máy chủ.


2

Ý tưởng cơ bản là quay lại trang cuối cùng hoặc phân chia trang web hợp lý.

Nhìn vào Gmail, bạn sẽ thấy nếu bạn thực hiện tìm kiếm và nhấp vào một thư, sau đó nhấn nút quay lại, nó sẽ đưa bạn trở lại tìm kiếm mà bạn đã thực hiện.

Khi bạn nhấp vào nó trong hầu hết các trình duyệt, nó sẽ gửi lại yêu cầu http cuối cùng hoặc sẽ tải một bộ nhớ cache nếu trình duyệt lưu trữ các trang web.


Khi nào trình duyệt sử dụng bộ nhớ cache và khi nào nó gửi lại yêu cầu?
Pierre Thibault

Nó phụ thuộc vào trình duyệt và những gì đã được thực hiện cho đến thời điểm đó. Bạn có thể đặt hầu hết các trình duyệt không lưu vào bộ nhớ cache và do đó chúng sẽ luôn tải lại. Có một thẻ meta HTML để lưu vào bộ nhớ đệm nhưng việc tôn trọng điều đó là tùy thuộc vào trình duyệt.
BobBrez

2

Tôi nghĩ cách dễ nhất để giải thích điều này là bằng mã giả:

class Page:
    String url, ...
    Page previous, next # implements a doubly-linked list

class History:
    Page current # current page

    void back():
        if current.previous == null:
            return
        current = current.previous
        refresh()

    void forward():
        if current.next == null:
            return
        current = current.next
        refresh()

    void loadPage(Page newPage):
        newPage.previous = current
        current.next = newPage # remove all the future pages
        current = current.next
        display(current)

1

Lịch sử của các trang đã xem được lưu giữ ở dạng giống như ngăn xếp. Khi bạn "bật" ba trang trên cùng (ví dụ: A, B, C) và sau đó chuyển sang một trang khác D, bạn không thể đến B lần nữa bằng cách nhấn tiếp.


0

Là một devoloper, bạn nên đảm bảo rằng ứng dụng web của mình hoạt động bất kể trình duyệt xử lý nút Quay lại như thế nào :-) Nó có gửi lại yêu cầu không? Yêu cầu mới có giống với yêu cầu cũ hay nó khác biệt theo bất kỳ cách nào? Trình duyệt sẽ yêu cầu người dùng xác nhận ĐĂNG lại? Phần tử nào của trang sẽ được yêu cầu lại và phần tử nào được tải từ bộ nhớ cache? Trình duyệt có tôn trọng các tiêu đề kiểm soát bộ nhớ cache của tôi không?

Câu trả lời cho những câu hỏi này phụ thuộc vào kiểu dáng, phiên bản của trình duyệt và cài đặt của người dùng. Thiết kế phần mềm cho bạn để tất cả những điều này không còn quan trọng nữa.

Xin lỗi vì câu trả lời không trực tiếp lắm, nhưng có một số câu trả lời thẳng thắn ở đây rồi.


Than ôi, có tính đến tất cả các tác động có thể có của nút quay lại, thứ khiến hầu hết các nhà phát triển phát điên, bao gồm cả bản thân tôi.
Louise

0

trình duyệt luôn lưu trữ các trang để ghi nhớ và khi chúng tôi nhấn nút quay lại, nó không gửi yêu cầu đến máy chủ cho trang trước đó thay vào đó nó chỉ thấy bộ nhớ cache của nó nơi lưu trữ các trang và nó tuân theo quy tắc LIFO, đó là lý do tại sao nó cung cấp cho chúng tôi trang đó đầu tiên khi nhấn nút quay lại mà chúng tôi đã mở ở trang cuối cùng


2
Không, nó không hoạt động, hãy để điều đó! Nếu bộ nhớ cache không còn hợp lệ, nó sẽ gửi yêu cầu trở lại máy chủ để lấy lại trang.
Pierre Thibault

-1

Trình duyệt tải trang được xem lần cuối trước trang hiện tại và sau đó chạy theo bất kỳ chuyển hướng nào có thể xảy ra?

Tôi dường như đã bỏ lỡ điểm của câu hỏi.


Họ có thể muốn vô hiệu hóa nút quay lại - hoặc ngăn chặn việc sử dụng nó. Chúc may mắn.
John Hoven
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.