Chuyển hướng HTTP: 301 (vĩnh viễn) so với 302 (tạm thời)


381

Là khách hàng có nghĩa vụ phải cư xử khác nhau? Làm sao?


RFC 2616 - Mã trạng thái HTTP Tôi có thể lặp lại mọi thứ trong đó, nhưng nó nêu khá rõ ràng;)
Tiemen

2
Đáng chú ý là thông số kỹ thuật cũng cung cấp mã trạng thái 303 và 307 cho các chuyển hướng tạm thời nhiều sắc thái hơn.
Patrick McElhaney

303 và 307 không thực sự cần thiết nữa. 303 được cho là chỉ định rằng URL mới có liên quan nhưng không tương đương và nên được tải bằng GET ngay cả khi yêu cầu hiện tại là POST, nhưng dù sao trình duyệt cũng thực hiện điều này với 302. 307 được cho là xác định rõ ràng rằng chuyển hướng là tạm thời trái ngược với 302, điều này không xác định liệu nó có phải là tạm thời hay không, nhưng dù sao trình duyệt và trình thu thập thông tin cũng coi 302 là tạm thời.
thomasrutter

Câu trả lời:


569

Trạng thái 301 có nghĩa là tài nguyên (trang) được di chuyển vĩnh viễn đến một vị trí mới. Máy khách / trình duyệt không nên cố gắng yêu cầu vị trí ban đầu mà sử dụng vị trí mới kể từ bây giờ.

Trạng thái 302 có nghĩa là tài nguyên tạm thời được đặt ở một nơi khác và ứng dụng khách / trình duyệt sẽ tiếp tục yêu cầu url gốc.


12
Cảm ơn bạn. Điều này có nghĩa là nếu tôi sử dụng chuyển hướng 301 (vĩnh viễn), khách hàng có thể quyết định không bao giờ lấy lại vị trí cũ và thay vào đó luôn luôn sử dụng trực tiếp URL mới?
flybywire

18
Chính xác! Trên thực tế, theo thông số kỹ thuật, khách hàng NÊN luôn đi đến địa điểm mới.
Philippe Leybaert

7
Nhưng trong một trình duyệt, điều này ảnh hưởng như thế nào? Viết lại lịch sử trong nút quay lại chẳng hạn, để tránh quay lại sai trong 301? Âm thầm thay đổi một dấu trang trên 301 nếu bạn nhấp vào một cái cũ?
Xavi Montero

9
@XaviMontero Hầu hết các trình duyệt hiện đại đều lưu trữ bộ nhớ cache 301s và sẽ không yêu cầu nguồn gốc trong tối đa 6 tháng
Jon

34
Thủ thuật để nhớ mã trạng thái HTTP 301-> Perm và 302-> Chuyển hướng tạm thời Hai bắt đầu bằng T, giống như bắt đầu tạm thời với T.
ScottCate

108

Khi một con nhện công cụ tìm kiếm tìm thấy 301 mã trạng thái trong tiêu đề phản hồi của trang web, nó hiểu rằng trang web này không còn tồn tại, nó tìm kiếm tiêu đề vị trí trong phản hồi, chọn URL mới và thay thế URL được lập chỉ mục bằng URL mới và cũng chuyển pagerank .

Vì vậy, công cụ tìm kiếm sẽ làm mới tất cả các URL được lập chỉ mục không còn tồn tại (tìm thấy 301) với URL mới, điều này sẽ giữ lại lưu lượng truy cập trang web cũ của bạn, pagerank và chuyển hướng nó sang một cái mới (bạn sẽ không mất lưu lượng truy cập của trang web cũ).

Trình duyệt: nếu trình duyệt tìm thấy mã trạng thái 301 thì nó lưu trữ ánh xạ của URL cũ với URL mới, máy khách / trình duyệt sẽ không cố gắng yêu cầu vị trí ban đầu mà sử dụng vị trí mới kể từ bây giờ trừ khi bộ nhớ cache bị xóa.

nhập mô tả hình ảnh ở đây

Khi một con nhện công cụ tìm kiếm tìm thấy trạng thái 302 cho một trang web, nó sẽ chỉ chuyển hướng tạm thời đến vị trí mới và thu thập dữ liệu cả hai trang. URL trang web cũ vẫn tồn tại trong cơ sở dữ liệu của công cụ tìm kiếm và nó luôn cố gắng yêu cầu vị trí cũ và thu thập dữ liệu. Máy khách / trình duyệt vẫn sẽ cố gắng yêu cầu vị trí ban đầu.

nhập mô tả hình ảnh ở đây

Đọc thêm về cách triển khai nó trong asp.net c # và tác động đối với các công cụ tìm kiếm - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-t tạm -status-code- aspnet -csharp-Thực hiện.html


35

Chủ yếu là 301 so với 302 rất quan trọng để lập chỉ mục trong các công cụ tìm kiếm, vì trình thu thập thông tin của họ đưa điều này vào tài khoản và chuyển PageRank khi sử dụng 301.

Xem câu trả lời của Peter Lee để biết thêm chi tiết.


20

301 là tài nguyên được yêu cầu đã được gán một URI vĩnh viễn mới và mọi tham chiếu trong tương lai tới tài nguyên này phải được thực hiện bằng cách sử dụng một trong các URI được trả về.

302 là tài nguyên được yêu cầu tạm thời nằm trong một URI khác.

Do việc chuyển hướng có thể bị thay đổi, thỉnh thoảng, khách hàng nên tiếp tục sử dụng URI yêu cầu cho các yêu cầu trong tương lai.

Phản hồi này chỉ có thể lưu trong bộ nhớ cache nếu được chỉ định bởi trường tiêu đề Cache-Control hoặc Hết hạn.


1
Vì vậy, 301 có ý nghĩa, nhưng tôi đang có một thời gian khó khăn để đưa ra một ví dụ tốt sử dụng cho 302 .
Bob Stein

4
@ BobStein-VisiBone, ví dụ về chuyển hướng 302: tạo tệp old.php với mã <?php header("location: http://example.com/new.php"); ?>và tệp new.php - <?php echo 'I am new'; ?>và đi đến liên kết . Ở đó sẽ chuyển hướng và hiển thị văn bản "Tôi là người mới". Sau đó thay thế mã trong old.php đến <?php echo 'I am old'; ?>và cũng đi đến liên kết . Bạn sẽ thấy văn bản "Tôi già". Nếu bạn đã thực hiện chuyển hướng 301 trong old.php, bạn sẽ thấy văn bản "Tôi là người mới" ngay cả sau khi thay đổi mã của old.php.
Sứ đồ

2
@ BobStein-VisiBone Tôi có một trang bị phản đối và không thể hiển thị. Chúng tôi cần tạo một trang mới nhưng sẽ không sẵn sàng trong một thời gian. Chúng tôi sử dụng tạm thời trực tiếp đến một trang hiện có mà chúng tôi hữu ích cho khách truy cập. Khi trang mới được tạo, chúng tôi sẽ sử dụng chuyển hướng vĩnh viễn đến trang đó.
EddieC

4
302 là hữu ích nếu URL đích của bạn phụ thuộc vào trạng thái.
Brian

7
Bây giờ tôi đã được một lúc nhưng đây là một ví dụ tốt. Webcomics thường có một url dẫn đến truyện tranh mới nhất. Nếu đó là webcomic.com/latestvà chuyển hướng đến webcomic.com/some-comic-titlevới 301, trình duyệt sẽ luôn chuyển hướng đến "tiêu đề truyện tranh". Ngay cả khi truyện tranh tiếp theo đã được xuất bản và "mới nhất" bây giờ chuyển hướng đến "tiêu đề truyện tranh khác" ... Đây là nơi một 302 sẽ tốt hơn.
hsan

17

301 chuyển hướng được lưu trữ vô thời hạn (ít nhất là bởi một số trình duyệt).

Điều này có nghĩa là, nếu bạn thiết lập 301, hãy truy cập trang đó, bạn không chỉ được chuyển hướng mà còn chuyển hướng được lưu trữ.

Khi bạn truy cập lại trang đó, Trình duyệt * của bạn thậm chí không bận tâm đến việc yêu cầu URL đó, nó chỉ đi đến mục tiêu chuyển hướng được lưu trong bộ nhớ cache.

Cách duy nhất để hoàn tác 301 cho khách truy cập với chuyển hướng đó trong Cache, là chuyển hướng lại về URL ban đầu **. Trong trường hợp đó, Trình duyệt sẽ thông báo vòng lặp và cuối cùng thực sự yêu cầu URL đã nhập.

Rõ ràng, đó không phải là một lựa chọn nếu bạn quyết định 301 lên facebook hoặc bất kỳ tài nguyên nào khác mà bạn không hoàn toàn kiểm soát.

Thật không may, nhiều Nhà cung cấp dịch vụ lưu trữ cung cấp một tính năng trong Giao diện quản trị viên của họ được gọi đơn giản là "Chuyển hướng", thực hiện chuyển hướng 301. Nếu bạn đang sử dụng điều này để tạm thời chuyển hướng tên miền của bạn sang facebook như một trang sắp ra mắt, về cơ bản bạn đã bị lừa.

* ít nhất là Chrome và Firefox, theo trình duyệt bộ nhớ cache HTTP 301 trong bao lâu?. Chỉ cần dùng thử với Chrome 45. Chỉnh sửa: Safari 7.0.6 trên Mac cũng lưu trữ, khởi động lại trình duyệt không giúp ích được gì (Link nói rằng trên Safari 5 trên Windows, nó rất hữu ích.)

** Tôi đã thử javascript window.location = '', vì đó sẽ là giải pháp có thể được áp dụng trong hầu hết các trường hợp - nó không hoạt động. Nó dẫn đến một vòng lặp vô hạn không bị phát hiện. Tuy nhiên, php header('Location: new.url')không phá vỡ vòng lặp

Tóm lại: chỉ sử dụng 301s nếu bạn chắc chắn rằng bạn sẽ không bao giờ sử dụng URL đó nữa. Thường không bao giờ trên thư mục gốc (example.com/)


7

Vấn đề chính với 301 là trình duyệt sẽ lưu trữ chuyển hướng ngay cả khi bạn tắt chuyển hướng từ cấp máy chủ.

Luôn luôn tốt hơn để sử dụng 302 nếu bạn đang bật chuyển hướng cho một cửa sổ bảo trì ngắn.


Nó chắc chắn không phải là một "vấn đề"; nó chỉ là cách nó dự định làm việc. Chuyển hướng HTTP sang HTTPS, Chuyển hướng trang web bị bỏ rơi sang một trang mới, v.v., là một số cách sử dụng thông thường của 301.
HosseyNJF
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.