HSTS và chuyển hướng kép


9

Tôi quản lý một trang web nhỏ trong môi trường LAMP lưu trữ được chia sẻ: về cơ bản điều này có nghĩa là điều duy nhất tôi có thể chỉnh sửa là một tệp htaccess.

Tôi muốn thêm hỗ trợ HSTS (và tôi đã làm điều đó), nhưng, khi tôi kiểm tra trang web của mình ở đây để đủ điều kiện tải trước HSTS, tôi đã gặp lỗi sau:

Lỗi: HTTP chuyển hướng đến www trước

http://example(HTTP) phải ngay lập tức chuyển hướng đến https://example(HTTPS) trước khi thêm tên miền phụ www. Ngay bây giờ, chuyển hướng đầu tiên là Chuyển hướng https://www.example.bổ sung được yêu cầu để đảm bảo rằng bất kỳ trình duyệt nào hỗ trợ HSTS sẽ ghi lại mục nhập HSTS cho tên miền cấp cao nhất, không chỉ tên miền phụ.

Vì vậy, tôi cho rằng tôi nên chuyển hướng người dùng theo cách này:

  1. http://example (đây là những gì người dùng nhập vào thanh địa chỉ của trình duyệt của mình)
  2. https://example (chúng tôi chuyển hướng anh ấy đến phiên bản HTTPS của trang web)
  3. https://www.example (chúng tôi chuyển hướng anh ta một lần nữa đến tên miền phụ www)

Chuyển hướng hiện tại của tôi được thực hiện theo cách này:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Tôi đã cố gắng thêm một chuyển hướng trước dòng cuối cùng, theo cách này:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

nhưng tôi gặp lỗi "trang không chuyển hướng đúng" từ trình duyệt.

Vậy, cách thích hợp để chuyển hướng người dùng từ phiên bản http của trang web sang https và cuối cùng sang https bằng www là gì? Và: có rủi ro nào không?

Câu trả lời:


10

Như đã lưu ý trong các yêu cầu nộp danh sách tải trước HSTS :

  1. Chuyển hướng từ HTTP sang HTTPS trên cùng một máy chủ, nếu bạn đang nghe trên cổng 80.

Bạn cần chuyển hướng đến cùng một máy chủ (ví dụ. HTTP_HOST), Không chỉ đơn giản là example.comđầu tiên. Bạn không cần phải chuyển hướng đến example.comnếu người dùng đang yêu cầu www.example.comtrực tiếp. (Bài kiểm tra sẽ liên quan đến một yêu cầu example.com.) Sau đó, bạn có thể chuyển hướng đến tên miền phụ www chính tắc nếu được yêu cầu.

Tôi đã cố gắng thêm một chuyển hướng trước dòng cuối cùng, theo cách này:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Điều đó sẽ tạo ra một vòng lặp chuyển hướng, bởi vì lệnh trước RewriteCondchỉ áp dụng cho lần đầu tiên RewriteRule, vì vậy lệnh thứ hai RewriteRulesẽ chạy vô điều kiện.

Thay vào đó hãy thử một cái gì đó như sau:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

Biến HTTP_HOSTmáy chủ chứa giá trị của Hosttiêu đề yêu cầu HTTP (nghĩa là bất kỳ máy chủ nào đang được yêu cầu).

Trạng thái chuyển hướng thứ 2 ... cho tất cả các yêu cầu trong đó máy chủ được yêu cầu không bắt đầu www.sau đó tiền tố www.đến máy chủ. Tuy nhiên, điều này có thể không được chấp nhận nếu bạn có nhiều tên miền phụ (giải quyết cùng một địa điểm) mà bạn muốn tách riêng, vì chúng sẽ tự nhiên được chuyển hướng đến tên miền phụ www.

Lưu ý rằng đây là các chuyển hướng 302 (tạm thời). Chỉ thay đổi thành 301 khi bạn chắc chắn rằng nó hoạt động tốt.

Và: có rủi ro nào không?

Không có rủi ro. Vâng, có khả năng có hai chuyển hướng trong khi trước đây có thể chỉ có một (có thể được cho là kém hiệu quả hơn). Nhưng vẫn chỉ có hai chuyển hướng, điều này hoàn toàn OK cho SEO. Ngoài ra, với HSTS, tác nhân người dùng sẽ chỉ trải nghiệm chuyển hướng kép nhiều nhất một lần.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Ngoài ra: (Bỏ qua HSTS vào lúc này ...) Điều này sẽ không được hoàn thành bởi chính nó, vì nó không hợp thức hóa một yêu cầu cho https://example.com/...(ví dụ: HTTPS và apex tên miền).


Đọc thêm:


Cảm ơn bạn rất nhiều, tôi sẽ kiểm tra nó sớm. Trả lời nhanh cho Aside cuối cùng: dù sao thì nó cũng hoạt động nhưng có vẻ như đó là thứ tôi không thể kiểm soát trực tiếp (không phải trong tệp htaccess, ít nhất là: có bảng điều hướng chuyển hướng trong trình quản lý trang web của nhà cung cấp dịch vụ lưu trữ)

1
Btw, giải pháp của bạn HOÀN HẢO hoạt động! :-)

1
"bảng điều hướng trong trình quản lý trang web của nhà cung cấp dịch vụ lưu trữ" - Tôi sẽ luôn cảnh giác với các công cụ như vậy. Ví dụ, phần chuyển hướng trong cPanel rất hạn chế và khá khét tiếng.
MrWhite

1
Điều này phụ thuộc vào cách bạn đang đặt Strict-Transport-Securitytiêu đề phản hồi. Ví dụ: để đặt điều này trên chuyển hướng, bạn sẽ cần sử dụng alwaysđối số trên lệnh Header. Tôi đã trả lời một câu hỏi liên quan trên ngăn xếp Web Proasters (bỏ qua phần đầu tiên trong câu trả lời của tôi về on/ off) để đi sâu vào chi tiết hơn về việc triển khai " tải trước HSTS " .htaccess.
MrWhite

1
Không có gì. Thành thật mà nói, ngăn xếp Pro Webmaster có lẽ phù hợp hơn với .htaccesscác câu hỏi liên quan đến nhau (ServerFault giả định rằng bạn có toàn quyền kiểm soát máy chủ, trong trường hợp đó bạn sẽ không thực hiện việc này .htaccess). Có thể dễ dàng thực hiện điều này trong cấu hình máy chủ bằng cách sử dụng các <VirtualHost>thùng chứa riêng biệt (vì bạn không cần phải gây rối với các env vars và các điều kiện bổ sung - đó là "sạch hơn" và ít bị lỗi hơn). Tôi không nghĩ rằng tôi sẽ khuyên bạn nên gửi "danh sách tải trước" nếu bạn chỉ có quyền truy cập .htaccess. (2c của tôi)
MrWhite
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.