Apache menulis ulang subdomain apa pun kecuali satu ke https non-www

Jan 30 2020

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:

  1. Permintaan untuk http://www.example.netmemiliki dua pengalihan.

  2. Seperti kebanyakan contoh pengalihan www ke non-www di situs ini, ini tidak akan mengalihkan ww.atau wwww.jadi analitik saya memiliki banyak subdomain yang salah ketik yang belum dialihkan.

  3. Saya ingin mengecualikan dev.subdomain dari pengalihan, so http://dev.example.netdan httpssaudaranya, seperti yang saya gunakan dev.untuk pengembangan dan pementasan rilis.

Bagaimana saya harus menggabungkan ini?

Jawaban

1 MrWhite Jan 31 2020 at 05:43

1) Permintaan untuk http://www.example.netmemiliki dua pengalihan.

Ini dapat diselesaikan hanya dengan membalik kedua aturan tersebut. Kemudian www.example.netdialihkan 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.atau wwww.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, so http://dev.example.netdan httpssaudaranya, seperti yang saya gunakan dev.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:Hostyang sama (untuk mengakses Hostheader permintaan HTTP) jika ini adalah persyaratan penyeimbang beban? Jika tidak, lebih umum menggunakan HTTP_HOSTvariabel server di sini.

The !awalan pada CondPattern (yaitu. !^dev\.) Meniadakan regex, sehingga kondisi ini berhasil ketika Hosttidak 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.

2 Jin-ohKang Jan 31 2020 at 05:52
# 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]
  1. Ditambahkan NC( nocase) bendera ke X-Forwarded-Protokondisi, karena nilainya tampaknya tidak signifikan yaitu HTTP = Http = hTTp = http. Anda bebas untuk menghapus ini.
  2. Menambahkan NV( novary) bendera ke X-Forwarded-Protokondisi untuk menyembunyikannya dari Varyheader 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 membedakan httpdan httpskonten).
  3. Ditambahkan NV( novary) bendera ke Hostkondisi header untuk menyembunyikannya dari Varyheader respons. Anda juga dapat menghapus ini jika Anda memiliki server cache yang rusak.
  4. Membuat RewriteRuleurutan bendera konsisten ( L,R=301dan R=301,Lpada dasarnya sama).
  5. Mencegah www.example.net.but.not.actually.yours.comagar tidak dikenali, tetapi masih memungkinkan mis www.example.net:443.
  6. Gunakan secara konsisten %{REQUEST_URI}sebagai substitusi.
  7. Juga kenali wwdan wwww.