Redirect Redirect Loop dengan AWS ELB dan situs wordpress menggunakan plugin https wordpress

11

Saya telah mengkonfigurasi AWS ELB untuk menunjuk ke Server Ubuntu saya yang menjalankan Wordpress 3.2.1. Semuanya bekerja dengan baik di server sampai saya letakkan di belakang load balancer.

Saya mengatur load balancer untuk meneruskan port 80 ke port 80 dan port 443 ke port 80.

Saya mengatur file host virtual saya untuk memeriksa header dari elb:

RewriteEngine On
RewriteCond% {HTTP: X-Forwarded-Proto}! Https
RewriteRule! / Status https: //% {SERVER_NAME}% {REQUEST_URI} [L, R]

Sekarang setiap kali saya mengunjungi url https saya mendapatkan pesan ini:

Halaman web ini memiliki loop pengalihan
Halaman web di https://mywebsite.com/securepage/ telah mengakibatkan terlalu banyak pengalihan

Segera setelah saya menonaktifkan plugin https wordpress
( http://wordpress.org/extend/plugins/wordpress-https/ )
Halaman-halamannya berfungsi tetapi sekarang penuh dengan konten campuran. halaman yang seharusnya https tidak lagi https.

Segera setelah saya mengakses server secara langsung alih-alih melalui elb, ia berfungsi kembali.

Adakah ide tentang bagaimana saya bisa membuatnya bekerja dengan AWS ELB?

ChickenFur
sumber
sudahkah Anda memperbarui permalink? biasanya kita harus memperbarui pengaturan permalink pada wordpress
user905953

Jawaban:

13

Saya akan menebak tanpa Anda memposting konfigurasi ELB Anda bahwa ELB mengarahkan lalu lintas HTTPS (443 / tcp) ke instance EC2 pada HTTP (80 / tcp). Kemudian Anda .htaccessdan plugin mencoba mengalihkannya kembali ke HTTPS karena sedang dilihat melalui HTTP.

Pergi melihat konsol EC2 Anda di bawah Network & Security > Load Balancersdan saya akan membayangkan Anda akan melihat Port Configurationkata sesuatu di sepanjang baris443 forwarding to 80 (HTTPS, Certificate: blah)

Jeremy Bouse
sumber
1
Orang ini mengalami masalah yang sama. forums.aws.amazon.com/...
ChickenFur
1
dan yang ini terlihat mirip stackoverflow.com/questions/5741210/…
ChickenFur
kanan Anda, saya meneruskan 443 hingga 80.
ChickenFur
Saya telah menjalankan salah satu klien saya di bawah AWS selama lebih dari 2 tahun sekarang ... Ketika saya membaca pertanyaan Anda, itulah hal pertama yang muncul di kepala saya sebagai tersangka.
Jeremy Bouse
1
Mengubah LB ke titik 443 ke 443 memperbaikinya :) Terima kasih!
ChickenFur
17

Coba tambahkan ini ke Anda httpd.confatau.htaccess

SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS

Saat menggunakan load balancer + HTTPS, server web Anda tidak menyadari bahwa HTTPS sedang digunakan di ujung depan, jadi teruslah mencoba mengarahkan ulang ke situs HTTPS, padahal sebenarnya, HTTPS sudah digunakan.

Di atas akan menerjemahkan header yang dikirim Load Balancer Amazon ( X-Forwarded-Proto: https) ke variabel lingkungan yang dimengerti oleh Wordpress dan skrip PHP lainnya ( HTTPS=1)

AB Carroll
sumber
3
Ini akan menjadi cara yang benar melakukannya, karena dekripsi SSL tetap pada ELB
toske
1
Jika Anda menggunakan nginx, penambahan serupa adalah:fastcgi_param HTTPS on;
Akash Budhia
Posting ini mengakhiri rasa sakit saya yang panjang ... THX
Daywalker
3

Menurut Amazon di sini https://d0.awsstatic.com/whitepapers/deploying-wordpress-with-aws-elastic-beanstalk.pdf perbaikannya adalah:

/** Detect if SSL is used. This is required since we are terminating SSL either on CloudFront or on ELB */ 
if (($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https') OR ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
    {$_SERVER['HTTPS']='on';}

Saya masih berakhir dengan loop tanpa akhir, jadi saya mengubah konfigurasi WordPress saya dari:

define('WP_HOME','http://www.example.com');
define('WP_SITEURL','http://www.example.com');

untuk:

define('WP_HOME','https://www.example.com');
define('WP_SITEURL','https://www.example.com');

Ini akan memaksa pengguna untuk https, bahkan jika mereka mengetikkan http, plus itu membuatnya mudah untuk mengembangkan situs offline karena Anda baru saja memperbarui WP_HOME ke host lokal dan https tidak lagi menjadi default

brianlmerritt
sumber
1

Mengutip diri saya dari pos bermanfaat lain https://serverfault.com/a/858308/450836 :

Bagi saya itu cukup untuk menetapkan $ _SERVER ['HTTPS'] = 'on'; di wp-config.php. Saya menggunakan AWS ELB yang mengakhiri SSL pada ELB. Karenanya nginx menerima permintaan pada Port 80 (8080 setelah pernis) dan sepertinya wordpress tidak dapat mengatasinya sampai Anda secara eksplisit memberi tahu PHP bahwa situs tersebut sudah menggunakan https ...

Untuk Pendengar ELB non-SSL, saya menggunakan konfigurasi terpisah untuk mengalihkan semua lalu lintas ke https sebagai pendengar default.

Tim
sumber
0

Seperti yang disarankan @Tim, ini $_SERVER['HTTPS']='on';di wp-config.php melakukan trik untuk saya.

Saya juga menambahkan ini ke file .htaccess saya untuk memaksa HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]
Yordania
sumber
0

Perbaiki untuk terlalu banyak masalah pengalihan di aws ALB

Aktifkan modul tajuk kemudian tambahkan entri berikut di konfigurasi apache

SetEnvIf X-Forwarded-Proto "https" HTTPS = on RequestHeader atur HTTPS "on" env = HTTPS

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
George Ulahannan
sumber