36

Tôi hiện đang viết một ứng dụng web bằng angularjs, nhưng tôi nghĩ câu hỏi này áp dụng cho bất kỳ khung javascript phía máy khách nào định tuyến ở phía máy khách (as angular does).Trong một ứng dụng một trang, cách đúng đắn để xử lý các URL sai (lỗi 404) là gì?

Trong ứng dụng một trang, cách phù hợp để xử lý URL sai là gì?

Nhìn vào một vài trang web lớn, tôi thấy rằng gmail sẽ chuyển hướng đến hộp thư đến nếu bạn nhập bất kỳ URL ngẫu nhiên nào bên dưới https://mail.google.com/mail/. Điều này xảy ra phía máy chủ (với mã http 300) hoặc phía máy khách, tùy thuộc vào đường dẫn sai trước hay sau ký tự #. Mặt khác, twitter hiển thị một HTTP 404 thực cho bất kỳ URL không hợp lệ nào. Tùy chọn thứ ba sẽ hiển thị 404 "mềm", trang lỗi hoàn toàn phía máy khách.

Các giải pháp này có vẻ phù hợp cho các tình huống khác nhau. Twitter muốn các liên kết tới người dùng twitter và tweet là liên kết thực, vì vậy mọi người có thể chia sẻ chúng, đăng chúng trong các bài viết, v.v., vì vậy điều quan trọng là các liên kết không hợp lệ phải được nhận dạng như vậy (nếu tôi có liên kết bị hỏng tới một tweet trong trang web của tôi, một thu thập dữ liệu đơn giản sẽ cho tôi biết điều đó). Trong Gmail, mặt khác, bạn không được mong đợi chia sẻ liên kết vào hộp thư đến của mình và tôi thậm chí không chắc chắn liệu các liên kết có thực sự vĩnh viễn/liên tục hay không: có vẻ như cập nhật url chủ yếu phục vụ mục đích điều hướng lịch sử trình duyệt trong ứng dụng một trang. Cách tiếp cận thứ ba của việc đưa ra các lỗi mềm có thể thích hợp cho các tình huống tương tự như gmail, nhưng không có trang "mặc định" hợp lý.

Sau khi giới thiệu dài này, sau đây là một số câu hỏi cụ thể:

  • Có bao giờ chấp nhận để cho một trang báo lỗi "mềm" thay vì một lỗi 404, hoặc nên một ứng dụng duy nhất trang luôn chuyển hướng đến một 404 thực nếu url không hợp lệ?
  • Mã của Gmail có thể hoàn toàn không có lỗi, nhưng nếu có lỗi dẫn đến các liên kết không hợp lệ kết thúc chuyển hướng trở lại hộp thư đến, điều này có thể khiến người dùng khó hiểu hơn là trang lỗi. Đối với hầu hết các ứng dụng web trên mạng, không được kiểm tra tốt như gmail, liệu trang web có tốt hơn không?
  • Để triển khai 404 thực cho các ứng dụng một trang, có vẻ như cần phải sao chép logic định tuyến ở phía máy chủ. Có cách nào để khắc phục điều này?
  • Khi chuyển hướng đến 404, tôi nghĩ người dùng sẽ có thể thấy URL gây ra lỗi, có thể trong thanh URL. Với api lịch sử html5, tôi nghĩ rằng điều này có thể được thực hiện bằng cách đơn giản kích hoạt tải lại trang hiện tại (với url sai), kết hợp với định tuyến phía máy chủ được đề cập ở trên. Đối với các trình duyệt không hỗ trợ tính năng này hoặc khi sử dụng ký hiệu hashbang, điều này dường như không thể. Cách tốt nhất để hỗ trợ tất cả các trình duyệt là gì?
+1

Trang web của bạn có hoạt động không có javascript không? Bạn đang sử dụng history.pushState để cập nhật các URL qua javascripts hoặc các phân đoạn trong URL? –

+0

Ngoài ra, tại sao bạn lại nói về * chuyển hướng * tới 404, tại sao không chỉ * hiển thị * một? –

+0

@markus Trang web tôi hiện đang làm việc trên không hoạt động mà không có javascript. Nhưng tôi muốn liên kết sâu để làm việc, vì vậy người dùng có thể chia sẻ liên kết đến bên trong trang web (thông thường, điều này sẽ được gửi qua email). Tôi đang sử dụng ký hiệu hashbang cho bây giờ, nhưng angularjs làm cho nó dễ dàng chuyển sang html5 pushState nếu tôi muốn/cần. – jssebastian

Trả lời

5

tl; dr: Drop hashbang sự ủng hộ và lựa chọn PJAX như hành vi nếu bạn quan tâm đến SEO.

Bạn đang tạo Ứng dụng hoặc Trang web? Nếu trang web bạn cần trả lại 404 để bạn không nhầm lẫn google. Nó cần phải là 404 thực sự không chỉ hiển thị một thông báo của trang không tìm thấy (tức là 200 với thông báo "trang không tìm thấy" là rất xấu). Bạn cũng quan tâm đến những trình duyệt nào?

Ý kiến ​​của tôi là toàn bộ việc hiển thị bên máy chủ hashbang nên tránh (tức là Google SEO khó khăn #! hack). Hoặc sử dụng pushstate thực hoặc trả lại toàn bộ trang nếu URL thay đổi cho các trình duyệt không hỗ trợ pushstate (không phải là thay đổi băm).

Bây giờ lý do quan trọng là #! sẽ không bao giờ trả lại 404 vì nó không có ý nghĩa và không thể bắt chước phía máy chủ vì máy chủ không bao giờ nhận được gì sau #! khi chạy Javascript.

Vì vậy, nếu bạn thực sự quan tâm đến SEO, tôi sẽ làm một cái gì đó như PJAX và chỉ sử dụng pushstate đúng để định tuyến và sau đó chỉ thất bại với web cũ 1.0. Do đó các liên kết mà tôi khuyên bạn nên chia sẻ có thể thực sự là 404 không được có #! (truyền thống # là tốt miễn là nội dung của trang không thay đổi đáng kể).

Cuối cùng, 404 hầu như không phải là vấn đề mà là 30X tức là phản hồi chuyển hướng. Thats bởi vì trình duyệt sẽ tự động xử lý chuyển hướng để các cuộc gọi Javascript AJAX của bạn sẽ không bao giờ thấy một 30X (họ sẽ nhận được phản hồi chuyển hướng thay vì ... tức là 200). Để xử lý các câu trả lời 30X, bạn sẽ phải gửi lại tiêu đề cho mọi yêu cầu để cho biết URL được chuyển hướng là gì (tức là những gì bạn được chuyển hướng đến) để bạn không làm hỏng Lịch sử Pushstate.

Tất nhiên nếu bạn cần hỗ trợ hashbang như Twitter được sử dụng quá (and they are the ones that even killed hashbang), bạn có thể tận dụng Google Sitemaps và rel=nofollow để cố gắng giảm thiểu SEO xấu.

+0

PJAX có vẻ thú vị đối với người nào đó đang xây dựng từ đầu. Nhưng khuôn khổ anuglarjs hỗ trợ pushState ra khỏi hộp, vì vậy tôi đoán nó sẽ không cần thiết. Hoặc PJAX có làm gì hơn không? – jssebastian

+0

Nội dung tôi đang tạo ** ngay bây giờ ** là một ứng dụng, sẽ không được công cụ tìm kiếm lập chỉ mục. Nhưng tôi quan tâm đến việc hiểu rõ hơn vấn đề này. – jssebastian

+0

Tôi không biết vấn đề với phản hồi pushState và 30x. Tốt để biết. Bất kỳ con trỏ đến tài liệu/ví dụ/hướng dẫn về điều này? – jssebastian

Các vấn đề liên quan