HSTS dan pengalihan ganda

9

Saya mengelola sebuah situs web kecil di lingkungan LAMP hosting bersama: ini pada dasarnya berarti satu-satunya hal yang dapat saya edit adalah file htaccess.

Saya ingin menambahkan dukungan HSTS (dan saya melakukannya), tetapi, ketika saya menguji situs web saya di sini untuk kelayakan preload HSTS, saya mendapatkan kesalahan berikut:

Kesalahan: HTTP mengalihkan ke www terlebih dahulu

http://example(HTTP) harus segera dialihkan ke https://example(HTTPS) sebelum menambahkan subdomain www. Saat ini, pengalihan pertama adalah Pengalihan https://www.example.tambahan diperlukan untuk memastikan bahwa setiap browser yang mendukung HSTS akan merekam entri HSTS untuk domain tingkat atas, bukan hanya subdomain.

Jadi, saya kira saya harus mengarahkan pengguna dengan cara ini:

  1. http://example (ini yang dimasukkan pengguna di bilah alamat browsernya)
  2. https://example (kami mengarahkannya ke versi situs web HTTPS)
  3. https://www.example (kami mengarahkannya lagi ke subdomain www)

Arahan ulang saya saat ini dilakukan dengan cara ini:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Saya mencoba menambahkan arahan ulang sebelum baris terakhir, dengan cara ini:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

tapi saya mendapat kesalahan "halaman tidak mengarahkan ulang dengan benar" dari browser.

Jadi, apa cara yang tepat untuk mengarahkan pengguna dari versi http situs web ke https dan akhirnya ke https dengan www? Dan: apakah ada risiko?

HBruijn
sumber

Jawaban:

10

Sebagaimana tercantum pada persyaratan pengiriman daftar preload HSTS :

  1. Redirect dari HTTP ke HTTPS pada host yang sama, jika Anda mendengarkan pada port 80.

Anda perlu mengarahkan ulang ke host yang sama (mis. HTTP_HOST), Bukan hanya ke yang example.compertama. Anda tidak perlu mengarahkan ulang ke example.comjika pengguna meminta www.example.comsecara langsung. (Tes akan melibatkan permintaan untuk example.com.) Setelah itu Anda dapat mengarahkan ulang ke subdomain www kanonik jika diperlukan.

Saya mencoba menambahkan arahan ulang sebelum baris terakhir, dengan cara ini:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Itu akan membuat redirect loop, karena RewriteCondarahan sebelumnya hanya berlaku untuk yang pertama RewriteRule, sehingga yang kedua RewriteRuleakan berjalan tanpa syarat.

Coba sesuatu seperti yang berikut ini sebagai gantinya:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

The HTTP_HOSTvariabel server berisi nilai dari Hostheader permintaan HTTP (yaitu. Apapun host yang diminta).

Status pengalihan ke-2 ... untuk semua permintaan di mana host yang diminta tidak dimulai www.kemudian diawali www.dengan host. Namun, ini mungkin tidak dapat diterima jika Anda memiliki beberapa subdomain (yang memutuskan untuk tempat yang sama) yang ingin Anda pisahkan, karena mereka akan diarahkan ke subdomain www.

Perhatikan bahwa ini adalah 302 pengalihan (sementara). Ubah ke 301 hanya ketika Anda yakin itu berfungsi OK.

Dan: apakah ada risiko?

Tidak ada risiko. Ya, ada dua kemungkinan pengalihan sedangkan sebelumnya mungkin hanya ada satu (yang bisa dibilang kurang efisien). Tetapi masih ada hanya dua pengalihan, yang sangat baik untuk SEO. Selain itu, dengan HSTS, agen-pengguna hanya akan mengalami pengalihan ganda paling banyak satu kali.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Selain: (Mengabaikan HSTS untuk saat ini ...) Ini tidak akan lengkap dengan sendirinya, karena tidak mengkanonisasi permintaan untuk https://example.com/...(mis. HTTPS dan domain apex).


Bacaan lebih lanjut:

TuanWhite
sumber
Terima kasih banyak, saya akan segera mengujinya. Sebuah balasan cepat ke Aside final: yang satu tetap bekerja tetapi sepertinya itu adalah sesuatu yang saya tidak bisa langsung kontrol (tidak dalam file htaccess, setidaknya: ada panel redirect di pengelola situs web penyedia hosting)
1
Btw, solusi Anda SEMPURNA bekerja! :-)
1
"redirect panel di pengelola situs web penyedia hosting" - Saya akan selalu mewaspadai alat tersebut. Misalnya, bagian pengalihan di cPanel sangat terbatas dan agak terkenal.
MrWhite
1
Ini tergantung pada bagaimana Anda mengatur Strict-Transport-Securityheader respons. Misalnya, untuk mengatur ini di redirect Anda harus menggunakan alwaysargumen pada Headerdirective. Saya menjawab pertanyaan terkait pada tumpukan Webmaster Pro (lewati bagian pertama dari jawaban saya tentang on/ off) yang membahas lebih detail tentang penerapan " preload HSTS " di .htaccess.
MrWhite
1
Sama-sama. Sejujurnya, tumpukan Webmaster Pro mungkin lebih cocok untuk .htaccesspertanyaan yang hanya terkait (ServerFault mengasumsikan Anda memiliki kontrol penuh dari server, dalam hal ini Anda tidak akan melakukan ini di .htaccess). Ini bisa dibilang lebih mudah untuk menerapkan ini dalam konfigurasi server menggunakan <VirtualHost>wadah terpisah (karena Anda tidak perlu mengacaukan dengan env vars dan kondisi tambahan - ini "lebih bersih" dan kurang rentan terhadap kesalahan). Saya rasa saya tidak akan merekomendasikan pengiriman "preload list" jika Anda hanya memiliki akses ke .htaccess. (My 2c)
MrWhite