2014-12-28 21 views
6

Vì vậy, chứng chỉ SSL của tôi chỉ áp dụng cho https://example.com - không phải https://www.example.com (không thể khiếu nại, nó hoàn toàn miễn phí).Chuyển hướng https: // www đến https: // không phải www - mà không thấy lỗi chứng chỉ, có thể?

Sau khi mạo hiểm vào mod_rewrite và nhiều lần đọc (chủ yếu từ stackoverflow), tôi có tệp .htaccess làm hầu hết những gì tôi cần, đây là tệp (với tên miền được redacted tất nhiên).

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    #First rewrite any request to the wrong domain to use the correct one 
    RewriteCond %{HTTP_HOST} !^subdomain\. 
    RewriteCond %{HTTP_HOST} ^(www|ftp|mail)\.example\.com [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 

    #Redirect these subdomains to a subfolder 
    RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
    RewriteCond %1 !^(www|ftp|mail)$ [NC] 
    RewriteRule (.+)$ "http://example.com/%1" [L,P] 

    #Now, rewrite to HTTPS: 
    RewriteCond %{HTTPS} off 
    RewriteCond %{HTTP:X-Forwarded-Proto} !https 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
</IfModule> 

Kịch bản có chứa các nhận xét về ý nghĩa của nó (Tôi cần chúng nhiều hơn bạn nghĩ). Và có một tệp .htaccess bổ sung trên thư mục cho tên miền phụ đang được chuyển hướng (thư mục con trong thư mục web gốc, với tên miền phụ phù hợp) và mục nhập dns đi kèm trên máy chủ dns của tôi. .htaccess trên thư mục đó chỉ đơn giản là chuyển hướng http (cổng 80) sang https.

Hiện tại, tôi thực hiện những gì tôi cần nhưng tôi đang tìm cách viết đơn giản hơn. Và đơn giản hơn nó cũng có thể có nghĩa là toàn cầu hơn (nếu nó làm cho nó nhanh hơn so với các lĩnh vực mã hóa cứng) và nếu có bất kỳ cải tiến tốc độ nào để đạt được từ viết lại đã nói.

Như đã đề cập trước đây, chứng chỉ của tôi chỉ dành cho miền không phải www example.com nên điều này đưa tôi đến câu hỏi thứ hai (nhưng chính).

Lưu lượng truy cập được định tuyến như vậy: https://www.example.com sẽ gặp lỗi trước khi định tuyến, viết lại, v.v. Điều này là do một kết nối đến máy chủ web thậm chí không xảy ra vào thời điểm này, đúng không? Đây chủ yếu là máy chủ của bạn trao chứng chỉ của bạn qua và trình duyệt cho biết: đợi một phút!

Có cách nào để ngăn chặn giao thông để đạt máy chủ của bạn theo cách không đúng cách (https: // www) trước khi trình duyệt đưa ra một lỗi chứng chỉ?

Điều này không chỉ giới hạn ở phương thức .htaccess.

Có cách nào để thực hiện việc này không - tại tất cả? Và cách đó là gì?

Edit:

Tôi đã có một vài vấn đề với điều kiện của tôi và viết lại đánh thắc mắc nó không nên. Tôi cũng đã có một vài vòng chuyển hướng để hướng đến apache.org để nghiên cứu điều đó; vì vậy chỉ cần như là một cách để theo dõi những thay đổi nói ở đây là các tập tin .htaccess bây giờ:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # First rewrite any request to the wrong domain to use the correct one 
    RewriteCond %{HTTP_HOST} ^(www|ftp|mail)\.example\.com$ [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 

    # Redirect these subdomains to a subfolder 
    RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
    RewriteCond %{REQUEST_URI} !^([^/.]+)/([^/.]+) 
    RewriteCond %1 !^(www|ftp|mail)$ [NC] 
    RewriteRule ^(.*)$ http://example.com/%1$1 [L,NC,QSA] 

    #Now, rewrite to HTTPS: 
    RewriteCond %{HTTPS} off 
    RewriteCond %{HTTP_HOST} !^$ 
    RewriteCond %{HTTP_HOST} ^http://example\.com/$ [NC] 
    RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [L,R,NE] 
</IfModule> 

Trả lời

8

Có cách nào để ngăn chặn giao thông để đạt máy chủ của bạn theo cách không đúng cách (https: // www) trước trình duyệt đưa ra một lỗi chứng chỉ?

Không, bạn không thể làm gì, đánh giá của bạn chính xác là trình duyệt xem chứng chỉ máy chủ và thấy máy chủ không khớp và hiển thị lỗi. Lỗi không được tạo bởi máy chủ và điều này xảy ra trước khi yêu cầu được gửi tới máy chủ. Điều này xảy ra trong quá trình bắt tay SSL. Những điều duy nhất bạn có thể làm là ngăn chặn mọi liên kết http://www từ hiện tại hoặc mua chứng chỉ mới bao gồm "www".

Đối với các quy tắc của bạn, thực sự không có cách nào để đơn giản hóa vì bạn có nhiều điều kiện cho từng quy tắc.

+0

Cảm ơn bạn! Điều này khẳng định những nghi ngờ của tôi. Tôi tin rằng tôi có thể yêu cầu chứng chỉ bao gồm cả tên miền (www và không phải www) (không chắc chắn về tên). – avluis

+1

@avluis hầu hết các tổ chức phát hành bao gồm "www" ở phía trước miền làm tùy chọn, sau đó bạn có thể trả thêm tiền cho các tên miền phụ bổ sung hoặc một ký tự đại diện (tất cả tên miền phụ) –

+0

@JonLin Có thể là giải pháp? Vấn đề là https: // www đang phân phát chứng chỉ và điều này khiến cho sự bắt tay xảy ra TRƯỚC KHI chuyển hướng htacces. Giả sử chúng ta sẽ có cách để BẬT SSL trên phiên bản www của trang web? Bằng cách này không có bắt tay và directe được thực thi –

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