htaccess redirect ke https: // www


309

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://wwwdengan HTTPS.


SeharusnyaRewriteCond %{HTTPS} =off
Michael Berkowski

1
Jika saya melakukannya, pengalihan ke https: / / ww ww w w.
bigben

Dear @bigben Anda menerima jawaban yang salah di sini! Anda dapat mengetahui mengapa itu salah dalam jawaban saya .
Amir Fo

Jawaban:


632

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 ditegakkan www., jangan menggunakannya dalam aturan pertama.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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 terjadi ondan 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, periksa X-Forwarded-Prototajuk alih-alih %{HTTPS}variabel. Jawaban ini menunjukkan proses yang sesuai


14
Dalam beberapa kasus, sertifikat Anda mungkin hanya baik untuk satu domain (mungkin berfungsi dengan www, tetapi, bukan tanpa, misalnya). Dalam kasus seperti itu, redirect ke domain yang benar terlebih dahulu, lalu redirect ke https, jika tidak Anda akan mendapatkan pesan kesalahan sertifikat di browser Anda.
Nick Benson

19
Ketika saya menggunakan 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 bendera NEuntuk mencegah pengkodean ganda:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
Kocok

5
ini memberi saya loop pengalihan pada satu server, bekerja pada yang lain. saya benar-benar tidak tahu mengapa
user151496

4
@ user151496 Apakah server yang gagal menggunakan segala jenis proxy HTTP, seperti melewati cache Varnish, atau ke Penumpang? Jika demikian, Anda mungkin harus memeriksa X-Forwarded-Prototajuk untuk memverifikasi HTTPS, bukan %{HTTPS}variabel. Anda tidak mengatakan bagian mana yang menyebabkan perulangan, bagian wwwatau HTTPS, tetapi itulah hal pertama yang terlintas dalam pikiran saya.
Michael Berkowski

5
Sebenarnya, dua aturan yang Anda miliki di atas berada di urutan yang salah. Jika ada permintaan untuk http://example.com(mis. HTTP dan non-www) maka Anda akan mendapatkan pengalihan ganda. Pertama ke https://example.com(aturan pertama) dan kemudian ke https://www.example.com(aturan kedua). Anda dapat memperbaikinya dengan hanya membalikkan kedua aturan ini, karena kedua aturan mengalihkan ke HTTPS.
MrWhite

148

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.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

5
Memberi +1 karena ini adalah pilihan yang lebih baik untuk skenario ini, tetapi perhatikan bahwa ini tidak akan mencegah masalah yang sama terjadi jika klien mengakses 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)
Joshua Goossen

@ Tarzan: Itu salah. Pengecualian sertifikasi hanya terjadi karena Anda melakukan 2 pengalihan nyata . Ganti "[L, R = 301]" dengan "[R = 301]". Maka aturan tidak dibatalkan. L = LAST
defim

Jika Anda perlu menangani https://tanpa wwwmemiliki sertifikat hanya pada www, 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 ke httpketika mencoba terhubung ke https://example.comuntuk menghindari kesalahan sertifikat.
Eric Burel

1
Kedua aturan harus dibalik pula (seperti yang telah Anda lakukan), untuk mencegah pengalihan ganda saat meminta http://example.com(mis. HTTP dan tanpa www)
MrWhite

@EricBurel Anda tidak dapat menghindari kesalahan sertifikat dalam hal ini - jabat tangan SSL terjadi sebelum kode Anda dieksekusi (yang merupakan titik utama SSL di tempat pertama). Jika pengalihan Anda dapat dieksekusi sebelum kesalahan peramban cert maka itu akan menyiratkan bahwa permintaan telah dilakukan atas koneksi yang tidak aman - yang akan merupakan kegagalan mendasar dalam model SSL.
MrWhite

99

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:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
Harap perhatikan saran saat ini di situs dukungan Cloudflare sedikit berbeda: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott

1
Setuju dengan @ h0mayun, saran Cloudflare memberikan hasil dalam redirect loop, sedangkan kode ini di sini berfungsi dengan baik - terima kasih!
hobailey

2
Saya menjalankan angularjs di EC2. Solusi yang menggunakan RewriteCond% {HTTPS}! = Di beri saya pengalihan tanpa batas (tidak sepenuhnya yakin mengapa). Solusi ini, dengan X-Forwarded-Proto, tampaknya melakukan trik. Terima kasih!
Mark Watkins

3
Aku diubah =httpuntuk !=httpsuntuk lingkungan kita. X-Forwarded-Protoheader tidak dinyatakan jika http, begitu !=httpspula triknya.
Johnathan Elmore

Terima kasih atas wawasan ini! Saya menghabiskan waktu berjam-jam untuk mencari tahu mengapa {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.
camslice

56

SOLUSI BURUK DAN MENGAPA!

Jangan pernah menggunakan solusi di bawah ini karena ketika Anda menggunakan kode mereka itu adalah sesuatu seperti:

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

Peramban masuk ke:

http://example.com

Kemudian dialihkan ke:

https://example.com

Kemudian dialihkan ke:

https://www.example.com

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!

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

3
"SOLUSI BURUK DAN MENGAPA!" - Aturan itu salah urutan. Balikkan kedua aturan itu dan itu akan benar - Anda hanya akan mendapatkan satu pengalihan dan bukan dua.
MrWhite

4
Ya, kode yang diberikan menghasilkan 2 arahan ulang - saya tidak membantah - semua yang saya katakan adalah bahwa Anda hanya perlu membalik aturan ini untuk menyelesaikan masalah ini, tidak diperlukan perubahan lain. (Jawaban "diterima" memang salah - yang tampaknya Anda maksud - arahannya salah.)
MrWhite

1
yup @AmirForsati benar. itu mengarahkan dua kali dan ini harus menjadi jawaban yang diterima.
Zakir hussain

4
Anda dapat menggunakan ini jika ingin mempertahankan variabel domainname: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]
I.devries

Ini mengarahkan saya ke wp-content/cache/page_enhanced/dan kemudian seterusnya. Bagaimana saya bisa memperbaikinya? Sunting: Sepertinya saya harus meletakkannya di atas .htaccess. Terima kasih untuk skripnya :)
Giacomo

35

Ini adalah cara terbaik yang saya temukan untuk Proxy dan bukan pengguna proxy

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
Benar Ini adalah cara terbaik yang saya temukan untuk Proxy dan bukan pengguna proxy +1
Deep 3015

1
Ini adalah yang terbaik, karena ia menyelesaikan beberapa pengalihan 301
Niraj Chauhan

1
solusi terbaik yang pernah ada.
SM Jobayer Alam

1
Jawaban yang bagus Ini adalah satu-satunya yang bekerja untuk saya. Berfungsi jika Anda berada di belakang Cloudflare (meskipun saya tidak memiliki aturan halaman yang diatur di Cloudflare).
jasonco

Satu-satunya solusi yang bekerja pada semua kasus saya. Tetapi bagaimana jika saya ingin melakukan de oposite dan menghapus semua "www."
FedeKrum

27

Ada banyak solusi di luar sana. Berikut ini tautan ke wiki apache yang menangani masalah ini secara langsung.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

Saya menemukan dengan mengubah kondisi menulis ulang dari RewriteCond %{HTTPS} offke RewriteCond %{HTTPS} !=onpengalihan yang akan selalu terjadi, ini tampaknya jawaban yang lebih baik untuk saya.
Samuel Hawksby-Robinson

Solusi ini harus diterima sebagai jawaban yang benar! Bekerja untuk saya juga!
AndrewShmig

11

Untuk mengalihkan http: // atau https: // ke https: // www Anda dapat menggunakan aturan berikut di semua versi apache:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Perhatikan bahwa variabel% {REQUEST_SCHEME} tersedia untuk digunakan sejak apache 2.4 .


1
Masalah !: Jika HTTP_HOST sudah mengandung www. tetapi skema bukan HTTPS, maka Anda berakhir dengan www.www. di tuan rumah Anda.
Jpsy

@ Jpsy kamu benar. Saya telah memperbarui tujuan Pengalihan. Terima kasih atas masukan Anda.
starkeen

1
Ini hampir apa yang saya cari tetapi saya ingin menjaga domain generik seperti pada contoh lain. Apa itu mungkin?
cronoklee

8

Jika Anda menggunakan CloudFlare, pastikan Anda menggunakan sesuatu seperti ini.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

Ini akan menyelamatkan Anda dari redirect loop dan akan mengarahkan ulang situs Anda ke SSL dengan aman.

PS Sebaiknya periksa mod_rewrite.c!


itu tidak mengarahkan https: // theurlwithoutwww.com ke https: // www.
thesearentthedroids

Ini sebenarnya hanya solusi yang berfungsi jika Anda memiliki beberapa petunjuk "tambahkan www" sebelumnya. Solusi lain memberi saya "banyak pengalihan".
Daniel.P.


2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Catatan: Pastikan Anda telah melakukan langkah-langkah berikut

  1. sudo a2enmod menulis ulang
  2. sudo service apache2 restart
  3. Tambahkan Mengikuti di file vhost Anda, yang terletak di /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Sekarang .htaccess Anda akan berfungsi dan situs Anda akan dialihkan ke http: // ke https: // www


1

Mirip dengan solusi Amir Forsati, htaccess redirect ke https: // www tetapi untuk nama domain variabel, saya sarankan:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]

0

Ditetapkan dalam file .htaccess Anda

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


-2

Saya coba jawaban pertama dan tidak berfungsi ... Ini berhasil:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.