Saya memiliki kode htaccess berikut:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Saya ingin situs saya dialihkan ke https://www.
dengan HTTPS, dan menegakkan www.
subdomain, tetapi ketika saya mengakses http://www.
(tanpa HTTPS), itu tidak mengarahkan saya ke https://www
dengan HTTPS.
RewriteCond %{HTTPS} =off
Jawaban:
Untuk memaksakan HTTPS terlebih dahulu, Anda harus memeriksa variabel lingkungan yang benar
%{HTTPS} off
, tetapi aturan Anda di atas kemudian menambahkan.www.
Karena Anda memiliki aturan kedua yang harus ditegakkanwww.
, jangan menggunakannya dalam aturan pertama.Tentang proksi
Ketika di belakang beberapa bentuk proxy, di mana klien terhubung melalui HTTPS ke proxy, load balancer, aplikasi Penumpang, dll.,
%{HTTPS}
Variabel mungkin tidak akan pernah terjadion
dan menyebabkan loop penulisan ulang. Ini karena aplikasi Anda benar-benar menerima lalu lintas HTTP biasa meskipun klien dan penyeimbang proxy / beban menggunakan HTTPS. Dalam kasus ini, periksaX-Forwarded-Proto
tajuk alih-alih%{HTTPS}
variabel. Jawaban ini menunjukkan proses yang sesuaisumber
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
URL seperti exaple.com/?bla=%20 menjadi exaple.com/?bla=%2520 , yaitu tanda persen telah dikodekan. Pertimbangkan menggunakan benderaNE
untuk mencegah pengkodean ganda:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
X-Forwarded-Proto
tajuk untuk memverifikasi HTTPS, bukan%{HTTPS}
variabel. Anda tidak mengatakan bagian mana yang menyebabkan perulangan, bagianwww
atau HTTPS, tetapi itulah hal pertama yang terlintas dalam pikiran saya.http://example.com
(mis. HTTP dan non-www) maka Anda akan mendapatkan pengalihan ganda. Pertama kehttps://example.com
(aturan pertama) dan kemudian kehttps://www.example.com
(aturan kedua). Anda dapat memperbaikinya dengan hanya membalikkan kedua aturan ini, karena kedua aturan mengalihkan ke HTTPS.Jawaban Michals berhasil bagi saya, meskipun dengan satu modifikasi kecil:
Masalah:
ketika Anda memiliki satu sertifikat keamanan situs , peramban yang mencoba mengakses halaman Anda tanpa https: // www. (atau domain mana pun yang dicakup sertifikat Anda) akan menampilkan layar peringatan merah jelek sebelum menerima redirect ke halaman https yang aman dan benar.
Larutan
Pertama-tama gunakan pengalihan ke www (atau domain mana pun yang dicakup oleh sertifikat Anda) dan baru kemudian lakukan pengalihan https. Ini akan memastikan bahwa pengguna Anda tidak dihadapkan dengan kesalahan apa pun karena browser Anda melihat sertifikat yang tidak mencakup url saat ini.
sumber
https://example.com
, tetapi menurut saya itu adalah format yang paling tidak mungkin untuk diketik oleh pengguna. (Jawaban yang diterima juga akan memiliki masalah yang sama)https://
tanpawww
memiliki sertifikat hanya padawww
, cukup tambahkan aturan ini ke solusinya:RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
Ini hanya kembali kehttp
ketika mencoba terhubung kehttps://example.com
untuk menghindari kesalahan sertifikat.http://example.com
(mis. HTTP dan tanpa www)Jika Anda menggunakan CloudFlare atau CDN serupa, Anda akan mendapatkan kesalahan loop tak terbatas dengan solusi% {HTTPS} yang disediakan di sini. Jika Anda pengguna CloudFlare Anda harus menggunakan ini:
sumber
=http
untuk!=https
untuk lingkungan kita.X-Forwarded-Proto
header tidak dinyatakan jika http, begitu!=https
pula triknya.{HTTPS}
tidak bekerja. Saya mencoba{ENV:HTTPS}
dan bahkan{SERVER_PORT} 443
, tetapi pada akhirnya itu karena saya perlu memeriksa header permintaan HTTP kustom Cloudflare.SOLUSI BURUK DAN MENGAPA!
Jangan pernah menggunakan solusi di bawah ini karena ketika Anda menggunakan kode mereka itu adalah sesuatu seperti:
Peramban masuk ke:
Kemudian dialihkan ke:
Kemudian dialihkan ke:
Ini terlalu banyak permintaan ke server.
Sebagian besar jawaban yang diterima bahkan memiliki masalah ini.
SOLUSI TERBAIK DAN JAWABANNYA
Kode ini memiliki
[OR]
kondisi untuk mencegah perubahan ganda di url!sumber
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
wp-content/cache/page_enhanced/
dan kemudian seterusnya. Bagaimana saya bisa memperbaikinya? Sunting: Sepertinya saya harus meletakkannya di atas.htaccess
. Terima kasih untuk skripnya :)Ini adalah cara terbaik yang saya temukan untuk Proxy dan bukan pengguna proxy
sumber
Ada banyak solusi di luar sana. Berikut ini tautan ke wiki apache yang menangani masalah ini secara langsung.
http://wiki.apache.org/httpd/RewriteHTTPToHTTPS
sumber
RewriteCond %{HTTPS} off
keRewriteCond %{HTTPS} !=on
pengalihan yang akan selalu terjadi, ini tampaknya jawaban yang lebih baik untuk saya.Untuk mengalihkan http: // atau https: // ke https: // www Anda dapat menggunakan aturan berikut di semua versi apache:
Apache 2.4
Perhatikan bahwa variabel% {REQUEST_SCHEME} tersedia untuk digunakan sejak apache 2.4 .
sumber
Jika Anda menggunakan CloudFlare, pastikan Anda menggunakan sesuatu seperti ini.
Ini akan menyelamatkan Anda dari redirect loop dan akan mengarahkan ulang situs Anda ke SSL dengan aman.
PS Sebaiknya periksa mod_rewrite.c!
sumber
sumber
Catatan: Pastikan Anda telah melakukan langkah-langkah berikut
Sekarang .htaccess Anda akan berfungsi dan situs Anda akan dialihkan ke http: // ke https: // www
sumber
Mirip dengan solusi Amir Forsati, htaccess redirect ke https: // www tetapi untuk nama domain variabel, saya sarankan:
sumber
Ditetapkan dalam file .htaccess Anda
sumber
Saya menggunakan kode di bawah ini dari situs web ini, ini berfungsi dengan baik https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/
Semoga ini bisa membantu
sumber
Saya coba jawaban pertama dan tidak berfungsi ... Ini berhasil:
sumber