htaccess redirect non-www ke www dengan SSL / HTTPS

10

Saya ingin aturan penulisan ulang yang mengalihkan semuanya ke https:// DAN www .

Misalnya http://example.comharus pergi kehttps://www.example.com

Inilah yang saya miliki:

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

Jawaban:

11

Saya menemukan solusinya.

Tanpa HSTS (pengalihan tunggal):

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]

Dengan HSTS (pengalihan ganda):

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]
Akan
sumber
1
Perhatikan bahwa ini akan menghasilkan pengalihan ganda ketika meminta http://example.com(mis. HTTP dan non-www), karena ini akan mengarahkan ulang ke HTTPS pada host yang sama (mis. Tanpa www) dan kemudian mengarahkan kembali wwwsebagai pengalihan kedua. Anda dapat memperbaikinya dengan hanya membalik kedua aturan ini.
MrWhite
@ MrWhite @akan Anda benar-benar ingin pengalihan ganda pada pengalihan yang tepat https://, terutama jika Anda menggunakan HSTS. Dengan cara ini, preferensi HSTS Anda dapat disimpan oleh browser untuk domain Anda dan permintaan berikutnya akan selalu default kehttps://
xsrf
@xsrf Masih "layak" (dan lebih efisien) untuk memiliki satu pengalihan www dan HTTPS. Itu hanya perlu disimpan terpisah ketika Anda menerapkan HSTS.
MrWhite
Baik poin bagus dari xsrf dan MrWhite. Saya sudah memperbarui jawabannya.
Will
@ xsrf Saya memeriksa pengalihan ganda dengan htaccess.madewithlove.be dan tampaknya pengalihan hanya http: //> https: // bukan www .
Will
6

Kondisi Anda secara implisit DAN akan dan kondisi kedua Anda akan selalu benar (kecuali jika Anda memiliki domain lain), sehingga aturan Anda saat ini hanya akan mengarahkan lalu lintas non-SSL.

Anda perlu ORkondisi dan meniadakan kondisi www(kedua):

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

Jika SERVER_PORTbukan 443 (mis. Bukan HTTPS) atau host tidak memulai dengan www.(mis. Anda mengakses domain kosong) maka arahkan ke URL kanonik.

Namun, apakah ini akan dialihkan https://example.comke https://www.example.comakan tergantung pada sertifikat keamanan Anda. (Situs Anda harus dapat diakses oleh www dan non-www melalui SSL agar pemicu .htaccess diarahkan.)

TuanWhite
sumber
1

Ini akan digunakan untuk www atau non-www. Jika Anda mencoba membuka tautan dengan www maka url redirect ke https dengan www

Contoh: http://domain.comredirect kehttps://domain.com

atau Jika Anda mencoba membuka tautan dengan non-www maka url redirect ke https dengan non-www

Contoh: http://www.domain.comredirect kehttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ajay Patidar
sumber
Ini tidak menangani pengalihan non-www ke www seperti yang dinyatakan dalam pertanyaan.
MrWhite
Anda dapat menambahkan baris ini di htaccess RewriteCond% {HTTP_HOST}! ^ Www \. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Ajay Patidar
Ganti RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] olehRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Ajay Patidar
Anda dapat mengedit jawaban Anda.
MrWhite