Redirect loop menggunakan cloudflare's Flexible ssl

10

Saya mencoba menerapkan SSL Fleksibel yang disediakan oleh CloudFlare ke situs saya.

Ini konfigurasi nginx saya:

# PHP-FPM upstream; change it accordingly to your local config!
upstream php-fpm {
    server 127.0.0.1:9000;
}

server {
    listen         80;
    server_name    example.com www.example.com;
    return         301 https://$server_name$request_uri;
}

server {
    ## Listen ports
    listen 443;

    # use _ if you want to accept everything, or replace _ with domain
    server_name example.com www.example.com;

    location / {
      #proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header X_FORWARDED_PROTO https;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Url-Scheme $scheme;
      proxy_redirect    off;
      proxy_max_temp_file_size 0;
    }

(...rest of config...)

Namun, ketika saya mencoba untuk terhubung ke situs web (Wordpress), saya mendapatkan redirect loop (chrome: ERR_TOO_MANY_REDIRECTS). Bagaimana cara mengkonfigurasi nginx untuk mencegah hal ini?

Deqq
sumber

Jawaban:

30

Ssl fleksibel Cloudflare berarti koneksi antara cloudflare dan server Anda selalu melalui http:

koneksi selalu http

Mengingat ini - satu-satunya blok server dalam pertanyaan relevansi adalah yang ini:

server {
   listen         80;
   server_name    example.com www.example.com;
   return         301 https://$server_name$request_uri;
}

Seharusnya jelas mengapa hal itu menghasilkan redirect loop, ada 2 solusi untuk memaksa koneksi https menggunakan solusi ssl fleksibel mereka.

Gunakan aturan halaman Cloudflare

Jika akses ke server secara eksklusif melalui cloudflare Anda dapat menggunakan aturan halaman cloudflare sendiri untuk memodifikasi respons untuk domain, subdomain, atau pola url apa pun:

Menggunakan aturan halaman cloudflare

Salah satu opsi adalah untuk memaksa https:

Selalu gunakan HTTPS

Uji $http_x_forwarded_proto

Ada saat-saat Anda mungkin ingin menghindari menggunakan aturan halaman (harus langka atau hanya transisi), untuk skenario ini dimungkinkan untuk menguji protokol yang diteruskan dan mengarahkan berdasarkan itu:

server {
   listen         80;
   server_name    example.com www.example.com;

   if ($http_x_forwarded_proto = "http") {
     return 301 https://$server_name$request_uri;
   }

   ... directives to generate a response
}
AD7six
sumber
Dan apakah akan ada kesalahan dalam koneksi https saya seperti tidak semuanya dikirimkan melalui http dalam kasus ini?
Deqq
Bagaimana Anda mensetup cloudflare / nginx tidak ada hubungannya dengan itu, konten html akan menentukan apakah ada kesalahan yang dilaporkan.
AD7six
Baris pertama dari jawaban ini salah: koneksi antara browser dan CloudFlare dienkripsi TLS, koneksi dari CloudFlare ke server asal adalah http. Redirect loop dapat disebabkan oleh aturan halaman atau pengaturan tingkat tinggi yang menentukan jenis enkripsi salah - misalnya penuh ketika Anda benar-benar membutuhkan fleksibel.
Tim
Ada juga sebuah plugin yang membantu dengan ini: en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
Tim
5

Ini dapat memperbaiki masalah jika Anda memiliki sertifikat SSL yang valid di. Kotak [Crypto] dan pilih Full (strict)seperti pada gambar. masukkan deskripsi gambar di sini

Benar-benar tidak perlu memperbarui file konfigurasi server web untuk Nginx.

prosti
sumber
Penuh (ketat) hanya berfungsi jika server web asal memiliki sertifikat SSL yang valid dengan rantai sertifikat yang valid. Bekerja penuh dengan sertifikat SSL apa pun, termasuk yang ditandatangani sendiri. Ini bukan jawaban yang bagus untuk pertanyaan itu.
Tim
Ya, saya mengerti sekarang, pertanyaan menyebutkan sertifikat Fleksibel. Saya akan meningkatkan jawaban saya berkat umpan balik Anda dan saya akan lebih spesifik. Kami meningkatkan basis pengetahuan di sini. Sertifikat SSL yang valid memiliki nilai terbaik untuk Google jika kami mempertimbangkan perspektif SEO. Saya tidak menyesal setelah memposting ini.
prosti
Fleksibel / penuh / ketat tidak ada bedanya dengan SEO, pengaturan itu untuk koneksi ke server asal. Cloudflare menyajikan sertifikat https bersama untuk siapa pun yang meminta halaman, bagaimana terhubung ke asal sebagian besar tidak relevan.
Tim
Dengan asumsi server memang memiliki sertifikat SSL yang valid (OP tidak menentukan, dan saya datang ke sini melalui google config yang serupa), ini adalah opsi yang bagus - perhatikan juga dapat dicakup ke subdomain tertentu melalui Aturan Halaman.
skoczen
Ini adalah jawaban yang sangat bagus untuk saya yang memiliki SSL yang valid.
Philip
0

Jawaban AD7six sangat baik, meskipun tampaknya ada solusi yang lebih sederhana yang tidak memerlukan aturan halaman. Saya tidak yakin apakah ini merupakan tambahan baru sejak jawaban sebelumnya, tetapi harus didokumentasikan pada pertanyaan ini, terutama mengingat Anda hanya mendapatkan 3 aturan halaman gratis dengan Cloudflare pada saat penulisan.

Ketika Anda telah mengaktifkan SSL Fleksibel untuk domain tertentu, Anda dapat menggulir ke bawah pada Cryptotab dan mengaktifkan Always use HTTPSopsi. Opsi ini akan menyelesaikan masalah redirect loop (dijelaskan secara menyeluruh dalam jawaban AD7six ).

Opsi Cloudflare "Selalu Gunakan HTTPS"

Opsi ini dikonfirmasi bekerja dengan nginx; lebih jauh lagi, seharusnya tidak ada pengaturan server di mana opsi ini tidak berfungsi, asalkan SSL Fleksibel sudah diaktifkan dan berfungsi tanpa masalah.

Chad
sumber
Jika ui Cloudflare telah berubah (atau opsi baru telah tersedia) akan lebih baik untuk mengedit jawaban yang ada daripada membuat yang bersaing.
AD7six
@ AD7six Saya percaya ini merupakan tambahan untuk UI lama, bukan pengganti, yang berarti jawaban lama masih harus valid. Oleh karena itu jawaban yang terpisah akan lebih logis daripada mengedit yang asli, bukan?
Chad
Saya tidak berpikir, "Dulu Anda harus melakukan ini, tetapi sekarang ada tombol untuk itu!" adalah jawaban baru, tidak :)
AD7six