2011-11-30 37 views
17

Tôi tự hỏi mã trạng thái HTTP nào tôi phải gửi trong chuyển hướng ngôn ngữ.Mã trạng thái HTTP cho chuyển hướng ngôn ngữ

Tôi có mã php sau để chuyển hướng qua tiêu đề HTTP đến ngôn ngữ quan trọng nhất trong tiêu đề trình duyệt Chấp nhận ngôn ngữ.

<? 
$langs = array(); 

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
    // break up string into pieces (languages and q factors) 
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); 

    if (count($lang_parse[1])) { 
     // create a list like "en" => 0.8 
     $langs = array_combine($lang_parse[1], $lang_parse[4]); 

     // set default to 1 for any without q factor 
     foreach ($langs as $lang => $val) { 
      if ($val === '') $langs[$lang] = 1; 
     } 

     // sort list based on value 
     arsort($langs, SORT_NUMERIC); 
    } 
} 

// look through sorted list and use first one that matches our languages 
foreach ($langs as $lang => $val) { 
    if (strpos($lang, 'ca')===0) { 
    header("location: ca/"); 
    exit; 
    } else if (strpos($lang, 'es')===0) { 
    header("location: es/"); 
    exit; 
    } 
    echo "$lang => $val<br>"; 
} 
// show default site or prompt for language 
header("location: en/"); 

?> 

câu hỏi liên quan: HTTP status for functional redirect

Có lẽ 300, 301, 302, 303? Tại sao?

EDIT

Google gần đây đã được xuất bản này: http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html

Tôi thấy điều này:

HTTP TÌNH TRẠNG 300 Nhiều Lựa chọn

Tài nguyên yêu cầu tương ứng với bất kỳ một trong một tập hợp các đại diện của , mỗi lần có thông số riêng vị trí ific và thông tin thương mại- được hướng dẫn (mục 12) được cung cấp để người dùng (hoặc tác nhân người dùng) có thể chọn một đại diện được ưu tiên và chuyển hướng yêu cầu đến vị trí đó.

Trừ khi đó là yêu cầu HEAD, câu trả lời NÊN bao gồm một thực thể có chứa danh sách các đặc điểm và vị trí tài nguyên từ mà người dùng hoặc đại lý người dùng có thể chọn người thích hợp nhất. Định dạng đối tượng được chỉ định theo loại phương tiện được đưa ra trong trường tiêu đề Loại nội dung- Loại. Tùy thuộc vào định dạng và khả năng của

tác nhân người dùng, lựa chọn lựa chọn phù hợp nhất CÓ THỂ được thực hiện tự động. Tuy nhiên, đặc tả này không xác định bất kỳ tiêu chuẩn nào cho lựa chọn tự động như vậy.

Nếu máy chủ có lựa chọn đại diện được ưu tiên, nó NÊN bao gồm URI cụ thể cho đại diện đó trong trường Vị trí ; tác nhân người dùng CÓ THỂ sử dụng giá trị trường Vị trí để tự động chuyển hướng . Phản hồi này có thể lưu vào bộ nhớ cache trừ khi được chỉ định khác.

Và đây:

Lỗi HTTP 300 - Nhiều lựa chọn

Giới thiệu

máy chủ Web của bạn nghĩ rằng các URL được cung cấp bởi khách hàng (ví dụ như trình duyệt web của chúng tôi hoặc robot) không đủ cụ thể và cần có thêm một số lựa chọn để thực hiện thêm lựa chọn.

Đây thường là trường hợp URL đại diện cho mức cao nhóm cần chọn mức độ thấp hơn nào, ví dụ: một thư mục trong đó người dùng phải chọn một tệp cụ thể để truy cập .

300 lỗi trong chu kỳ HTTP

Bất kỳ khách hàng (ví dụ như trình duyệt web của bạn hoặc CheckUpDown robot của chúng tôi) đi qua các chu kỳ sau khi nó giao tiếp với máy chủ web:

lấy địa chỉ IP từ Tên IP của trang web (URL trang web không có 'http: //' hàng đầu). Tra cứu này (chuyển đổi tên IP thành địa chỉ IP) được cung cấp bởi máy chủ tên miền (DNS). Mở kết nối ổ cắm IP tới địa chỉ IP đó. Viết một luồng dữ liệu HTTP thông qua ổ cắm đó. Nhận lại luồng dữ liệu HTTP từ máy chủ Web để phản hồi. Luồng dữ liệu này chứa các mã trạng thái có giá trị được xác định bởi giao thức HTTP. Phân tích cú pháp luồng dữ liệu này cho mã trạng thái và thông tin hữu ích khác. Lỗi này xảy ra trong bước cuối cùng là ở trên khi khách hàng nhận được mã trạng thái HTTP mà nó nhận ra là '300'.

Sửa 300 lỗi - chung

Điều đầu tiên bạn cần làm là kiểm tra URL của bạn trong trình duyệt Web. Nếu bạn thấy một số loại trang web nhắc bạn về thêm hành động/sự lựa chọn, thì URL của bạn như là viết tắt của nó không đủ chi tiết để máy chủ Web xử lý.

Sửa lỗi 300 - CheckUpDown

Bạn không bao giờ nên thấy lỗi này trên tài khoản CheckUpDown của bạn nếu bạn đã cho chúng tôi một địa chỉ URL cấp cao nhất (như www.isp.com) để kiểm tra. Nếu nó xảy ra cho một URL cấp cao nhất, rất có khả năng máy chủ Web phần mềm đã được lập trình hoặc cấu hình không chính xác. Nếu bạn có , hãy cung cấp cho chúng tôi URL cấp thấp (chẳng hạn như www.isp.com/products/index.html) để kiểm tra, có khả năng là URL này không thể truy cập được ngay cả qua Trình duyệt web .

Điều đầu tiên bạn cần làm là kiểm tra URL của bạn trong trình duyệt Web. Nếu bạn thấy một trang Web hợp lý, sau đó nó có thể cho biết một khiếm khuyết trong phần mềm của chúng tôi. Tuy nhiên, nếu bạn thấy một số loại trang web nhắc bạn về hành động/lựa chọn khác, thì URL của bạn không phù hợp để chúng tôi kiểm tra, vì hệ thống của chúng tôi không thể thực hiện loại lựa chọn này.

Vui lòng liên hệ trực tiếp với chúng tôi (email ưa thích) bất cứ khi nào bạn gặp phải lỗi 300. Chỉ có chúng tôi mới có thể giải quyết chúng cho bạn. Nếu có lỗi trong phần mềm của chúng tôi, chúng tôi sẽ sửa lỗi đó. Tuy nhiên, nếu URL của bạn về cơ bản không phù hợp để chúng tôi sử dụng số , bạn cần thay đổi nó trên tài khoản CheckUpDown của mình (bắt đầu bằng cách nhấp vào nút 'Quản lý').

Trả lời

0

HTTP 303, bởi vì nó có công thức phù hợp nhất - Xem khác (302 di chuyển tạm thời và 301 - Đã di chuyển vĩnh viễn). Thực tế phản hồi HTTP 303 trong tình huống này để đảm bảo rằng trình duyệt của người dùng web sau đó có thể làm mới một cách an toàn phản hồi của máy chủ mà không làm cho yêu cầu HTTP POST ban đầu được gửi lại.

+1

Trong tất cả những sự lựa chọn, 303 là một trong đó là chắc chắn không chính xác. Ví dụ: nếu bạn PUT thành tài nguyên được thương lượng, bạn không muốn thư viện HTTP thay đổi yêu cầu GET sau khi chuyển hướng. –

1

Có thể HTTP 300 "Multiple Choices" vì nó về mặt kỹ thuật cùng một dữ liệu/tài liệu nhưng có sẵn bằng nhiều ngôn ngữ?

+0

Tôi nghĩ bạn nói đúng. –

+2

Mã trạng thái 300 phải được sử dụng để trả lời bằng tài liệu liệt kê tất cả các lựa chọn nếu thương lượng không thành công. – Gumbo

+0

Có - nhưng không phải là những gì đang được thực hiện (xem mã)? Nếu ngôn ngữ được tự động phát hiện từ HTTP_ACCEPT_LANGUAGE thì hãy làm điều đó - nếu không có một chú thích cho biết '// hiển thị trang web mặc định hoặc lời nhắc cho ngôn ngữ' ... đó là" lời nhắc cho ngôn ngữ "bit khiến tôi nghĩ rằng 300 "đúng" ... mặc dù, với hầu hết mọi thứ trong lập trình, luôn có nhiều giá trị cho "đúng";) – CD001

1

Tôi nghĩ rằng câu hỏi là có liên quan hơn những gì bạn muốn đạt được:

1: trang chỉ mục của bạn nên được trang đích cho khách truy cập của bạn, và bạn muốn trang mà được lập chỉ mục bởi các công cụ tìm kiếm.

Ưu điểm: Bạn có một trang mục nhập cho tất cả khách truy cập có thể lưu trữ thông tin bổ sung trước trang đích thực sự. Tuy nhiên, nó sẽ không có nội dung cho một ngôn ngữ cụ thể.

Nhược điểm: Bạn không có bất kỳ trang nội dung nào cho tất cả ngôn ngữ trên công cụ tìm kiếm.

2: Trang dịch thực tế phải là trang đích và nếu có thể, khách truy cập của bạn sẽ kết thúc trực tiếp tại trang đã dịch nếu có thể. Trang chuyển hướng chỉ dành cho khách truy cập đã kết thúc ngay tại trang web của bạn bằng cách nhập tên máy chủ vào thanh địa chỉ.

Ưu điểm: Bạn có nhiều "trang đích" cho từng ngôn ngữ riêng lẻ, giúp ghi điểm và nhấp qua.

Nhược điểm: Bạn không có trang đích chung.

Có nhiều ưu và nhược điểm hơn cho hai lựa chọn này, nhưng tôi không thể nghĩ về nó ngay bây giờ.

Nếu tùy chọn 1: sử dụng 302 vì bạn vẫn muốn nó là một phần của chỉ mục tìm kiếm. nếu tùy chọn 2: sử dụng 301 vì bạn không muốn lập chỉ mục trang đó. Hoặc, sử dụng một noindex trên trang chọn ngôn ngữ.

Afaik, Google chỉ tính đến, 301, 302 và 307 (bảo trì tạm thời) và tôi nghĩ rằng nó xem xét mọi thứ khác là 302 (có vẻ hợp lý nhất). Theo như trình duyệt, tôi nghĩ nó không quan trọng. Nó có thể ảnh hưởng đến bộ nhớ đệm, nhưng tôi nghĩ rằng ngày nay họ đang khá tích cực trong bộ nhớ đệm ngay cả 3xx phản ứng.

+0

Tôi muốn mỗi trang ngôn ngữ được lập chỉ mục trong mỗi chỉ mục tìm kiếm ngôn ngữ. (ví dụ: Tìm kiếm bằng tiếng Tây Ban Nha trả về/es /, tìm kiếm bằng tiếng Anh trả về/en /). Bạn có nghĩ rằng tôi nên có/như trang chủ cho ngôn ngữ mặc định? Tôi có nên sử dụng rel = canonical sau đó không? – jrosell

+0

Bạn có thể sử dụng kinh điển cho điều này nếu bạn muốn, nhưng không nhất thiết. Nếu bạn luôn chuyển hướng khách truy cập đến/en bằng 301, google sẽ chỉ lập chỉ mục url ngôn ngữ. – jishi

+0

Bạn có nghĩ rằng có ý nghĩa khi có 301 theo thương lượng nội dung không? – jrosell

4

Bạn có thể phục vụ mọi ngôn ngữ dưới cùng một url và sau đó sử dụng thương lượng nội dung của tiêu đề Accept-Language, nhưng tôi sẽ không đề xuất điều đó.

Tôi muốn đề xuất rằng trên url trang web gốc của bạn, bạn phát hành chuyển hướng (303 - Xem Khác) đến trang phụ ngôn ngữ (Ví dụ: /en). Khi bạn làm điều đó, hãy trả lời bằng tiêu đề Vary, chỉ định Accept-Language (Và bất kỳ tiêu đề có liên quan nào khác, chẳng hạn như Cookie). Bằng cách đó, bất kỳ người trung gian nào (proxy, bộ nhớ cache) đều có thể lưu trữ phản hồi. Tôi đặc biệt là không phải phát hành 301 vì bạn vẫn muốn liên kết trỏ đến url gốc. Trên trang ngôn ngữ cụ thể, tôi sẽ đặt một rel="canonical" vào url gốc.

Xem thêm những chủ đề:

+0

Tôi sẽ nghiên cứu 2 liên kết này, nhưng hiện tại ... Có thể xuất danh sách 'Tiêu đề vị trí cho từng ngôn ngữ' và để cho trình duyệt quyết định không? – jrosell

+0

Trình duyệt đã quyết định, theo cách nào đó, trong đó nó đã gửi một danh sách ưu tiên trong yêu cầu (tiêu đề 'Accept-Language'). Tiêu đề phản hồi 'Vary: Accept-Language' xác định rằng đây là cơ sở cho quyết định. – troelskn

+0

Bạn có chắc chắn rằng tiêu đề Vary là cần thiết không? Tôi không thấy bất kỳ trang web đa ngôn ngữ nào đáp ứng với tiêu đề Accept-Language Vary. – Jordy

4

Google sử dụng 302 Found để chuyển hướng đến trang cục bộ.

Tôi nghĩ rằng điều đó là an toàn nếu Google sử dụng ...

Tuy nhiên, nó luôn luôn tốt để kiểm tra những gì chọn câu trả lời nên làm và những gì nó là dành cho và nó ảnh hưởng đến bộ nhớ đệm:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

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