Apache menulis ulang subdomain apa pun kecuali satu ke https non-www
Saya mencoba untuk mengurangi jumlah 301 redirect chaining di server saya, jadi saya ingin menggabungkan subdomain ke non-www redirect (kecuali subdomainnya dev
) dengan pengalihan HTTP ke HTTPS (menggunakan %{HTTP:X-Forwarded-Proto}
) sebagai contoh di belakang penyeimbang beban.
Inilah yang saya miliki sejauh ini di saya .htaccess
:
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
Ada tiga masalah dengan implementasi saya saat ini:
Permintaan untuk
http://www.example.net
memiliki dua pengalihan.Seperti kebanyakan contoh pengalihan www ke non-www di situs ini, ini tidak akan mengalihkan
ww.
atauwwww.
jadi analitik saya memiliki banyak subdomain yang salah ketik yang belum dialihkan.Saya ingin mengecualikan
dev.
subdomain dari pengalihan, sohttp://dev.example.net
danhttps
saudaranya, seperti yang saya gunakandev.
untuk pengembangan dan pementasan rilis.
Bagaimana saya harus menggabungkan ini?
Jawaban
1) Permintaan untuk
http://www.example.net
memiliki dua pengalihan.
Ini dapat diselesaikan hanya dengan membalik kedua aturan tersebut. Kemudian www.example.net
dialihkan ke HTTPS pada pengalihan pertama, sehingga pengalihan HTTP ke HTTPS tidak perlu dipicu.
(Namun, hal ini mengasumsikan Anda tidak berniat menerapkan HSTS - dalam hal ini Anda harus menyimpannya sebagai dua pengalihan karena mengalihkan ke HTTPS pada nama host yang sama terlebih dahulu merupakan persyaratan.)
2) Seperti kebanyakan contoh pengalihan www ke non-www di situs ini, itu tidak akan mengalihkan
ww.
atauwwww.
jadi analitik saya memiliki banyak subdomain yang salah ketik yang belum dialihkan.
Biasanya, permintaan ke ww.
atau wwww.
subdomain tidak dapat diselesaikan, jadi hal ini biasanya tidak menjadi masalah. Agar ini bekerja, Anda harus mengkonfigurasi subdomain wildcard di DNS dan mengkonfigurasi server untuk menerima permintaan tersebut.
Tapi ini bisa dijelaskan dengan memodifikasi regex (snippet) dari ^www\.
menjadi ^w{2,4}\.
.
3) Saya ingin mengecualikan
dev.
subdomain dari redirection, sohttp://dev.example.net
danhttps
saudaranya, seperti yang saya gunakandev.
untuk pengembangan dan rilis staging.
Ini hanya berlaku untuk aturan HTTP ke HTTPS, jadi kondisi tambahan dapat diterapkan di sini untuk mengecualikan nama host yang dimulai dev.
.
Menyatukan poin-poin di atas, coba yang berikut ini:
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
Saya telah tetap menggunakan HTTP:Host
yang sama (untuk mengakses Host
header permintaan HTTP) jika ini adalah persyaratan penyeimbang beban? Jika tidak, lebih umum menggunakan HTTP_HOST
variabel server di sini.
The !
awalan pada CondPattern (yaitu. !^dev\.
) Meniadakan regex, sehingga kondisi ini berhasil ketika Host
tidak tidak mulai dengan dev.
. (Saya berasumsi www.dev.
bukan apa-apa?)
(.*)
sama seperti ^(.*)$
regex secara default.
Anda perlu membersihkan cache browser Anda sebelum menguji. Dianjurkan untuk menguji terlebih dahulu dengan 302 pengalihan (sementara) untuk menghindari masalah cache.
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV] RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301] # move http to https, except for dev.example.net RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV] RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- Ditambahkan
NC
(nocase
) bendera keX-Forwarded-Proto
kondisi, karena nilainya tampaknya tidak signifikan yaituHTTP = Http = hTTp = http
. Anda bebas untuk menghapus ini. - Menambahkan
NV
(novary
) bendera keX-Forwarded-Proto
kondisi untuk menyembunyikannya dariVary
header respons. Sekali lagi, Anda bebas untuk menghapus ini terutama jika tidak demikian (proxy balik secara otomatis memfilternya untuk Anda sebelum mengirimkannya ke klien) atau diperlukan untuk perilaku cache yang benar (cache tidak membedakanhttp
danhttps
konten). - Ditambahkan
NV
(novary
) bendera keHost
kondisi header untuk menyembunyikannya dariVary
header respons. Anda juga dapat menghapus ini jika Anda memiliki server cache yang rusak. - Membuat
RewriteRule
urutan bendera konsisten (L,R=301
danR=301,L
pada dasarnya sama). - Mencegah
www.example.net.but.not.actually.yours.com
agar tidak dikenali, tetapi masih memungkinkan miswww.example.net:443
. - Gunakan secara konsisten
%{REQUEST_URI}
sebagai substitusi. - Juga kenali
ww
danwwww
.