htaccess chuyển hướng không www sang www bằng SSL / HTTPS


10

Tôi muốn một quy tắc viết lại chuyển hướng mọi thứ thành https:// AND www .

Ví dụ http://example.comnên đihttps://www.example.com

Đây là những gì tôi có:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]

Câu trả lời:


11

Tôi tìm thấy giải pháp.

Không có HSTS (chuyển hướng đơn):

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Với HSTS (chuyển hướng kép):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

1
Lưu ý rằng điều này sẽ dẫn đến chuyển hướng kép khi yêu cầu http://example.com(ví dụ: HTTP và không phải www), vì trước tiên nó sẽ chuyển hướng đến HTTPS trên cùng một máy chủ (tức là không có www) và sau đó chuyển hướng đến wwwnhư một chuyển hướng thứ hai. Bạn có thể sửa điều này bằng cách đơn giản đảo ngược hai quy tắc này.
MrWhite

@MrWhite @will bạn thực sự muốn chuyển hướng kép trên một https://chuyển hướng thích hợp , đặc biệt nếu bạn sử dụng HSTS. Bằng cách này, tùy chọn HSTS của bạn có thể được trình duyệt lưu trữ cho cả tên miền của bạn và các yêu cầu tiếp theo sẽ luôn được mặc định làhttps://
xsrf

@xsrf Vẫn là "đúng" (và hiệu quả hơn) để có một chuyển hướng www HTTPS duy nhất . Nó chỉ cần được giữ riêng khi bạn đang thực hiện HSTS.
MrWhite

Cả hai điểm tốt từ xsrf và MrWhite. Tôi đã cập nhật câu trả lời.
Sẽ

@xsrf Tôi đã kiểm tra chuyển hướng kép bằng htaccess.madewithlove.be và nó xuất hiện chỉ chuyển hướng http: //> https: // không www .
Sẽ

6

Các điều kiện của bạn hoàn toàn VÀ VÀ và điều kiện thứ hai của bạn sẽ luôn đúng (trừ khi bạn có các tên miền khác), vì vậy các quy tắc hiện tại của bạn sẽ chỉ chuyển hướng lưu lượng truy cập không có SSL.

Bạn cần ORcác điều kiện và phủ nhận điều kiện www(thứ hai):

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Nếu SERVER_PORTkhông phải là 443 (tức là không phải HTTPS) hoặc máy chủ không bắt đầu bằng www.(tức là bạn đang truy cập tên miền trần) thì hãy chuyển hướng đến URL chính tắc.

Tuy nhiên, việc này có chuyển hướng https://example.comđến hay không https://www.example.comsẽ phụ thuộc vào chứng chỉ bảo mật của bạn. (Trang web của bạn cần có thể truy cập được bằng cả www và không www qua SSL để chuyển hướng .htaccess để kích hoạt.)


1

Điều này sẽ sử dụng cho cả www hoặc không www Nếu bạn cố mở liên kết với www thì chuyển hướng url sang https bằng www

Ví dụ: http://domain.comchuyển hướng đếnhttps://domain.com

hoặc Nếu bạn cố mở liên kết với không phải www thì chuyển hướng url sang https bằng không phải www

Ví dụ: http://www.domain.comchuyển hướng đếnhttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Điều này không xử lý chuyển hướng không www đến www như đã nêu trong câu hỏi.
MrWhite

Bạn có thể thêm dòng này trong htaccess RewriteCond% {HTTP_HOST}! ^ Www \. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Ajay Patidar

Thay thế RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] bằngRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Ajay Patidar

Bạn có thể chỉnh sửa câu trả lời của bạn.
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.