Endless Redirect Loop z AWS ELB i witryną wordpress za pomocą wtyczki wordpress https

11

Skonfigurowałem AWS ELB, aby wskazywał na mój Ubuntu Server z Wordpress 3.2.1. Wszystko działało świetnie na serwerze, dopóki nie postawiłem go za modułem równoważenia obciążenia.

Konfiguruję moduł równoważenia obciążenia, aby przekierował port 80 na port 80 i port 443 na port 80.

Konfiguruję plik wirtualnych hostów, aby sprawdzać nagłówki z łokcia:

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

Teraz za każdym razem, gdy przechodzę do adresu URL https, otrzymuję tę wiadomość:

Ta strona zawiera pętlę przekierowań
Strona internetowa pod adresem https://mywebsite.com/securepage/ spowodowała zbyt wiele przekierowań

Jak tylko wyłączę wtyczkę wordpress https
( http://wordpress.org/extend/plugins/wordpress-https/ )
Strony działają, ale teraz są pełne mieszanych treści. strony, które powinny być https, nie są już https.

Gdy tylko uzyskam bezpośredni dostęp do serwera zamiast przez łokieć, znów działa.

Jakieś pomysły na to, jak mogę to zrobić z AWB ELB?

Kurczak
źródło
czy zaktualizowałeś link bezpośredni? zazwyczaj musimy zaktualizować ustawienie bezpośredniego
linku

Odpowiedzi:

13

Zaryzykuję zgadnięcie bez opublikowania konfiguracji ELB, że ELB przekierowuje ruch HTTPS (443 / tcp) do instancji EC2 na HTTP (80 / tcp). Następnie Ty .htaccessi wtyczka próbujesz przekierować go z powrotem do HTTPS, ponieważ jest on wyświetlany przez HTTP.

Spójrz na swoją konsolę EC2 pod Network & Security > Load Balancersi wyobrażam sobie, że zobaczysz Port Configurationcoś podobnego do tego443 forwarding to 80 (HTTPS, Certificate: blah)

Jeremy Bouse
źródło
1
Ta osoba miała ten sam problem. forums.aws.amazon.com/…
ChickenFur
1
a ten wygląda podobnie stackoverflow.com/questions/5741210/…
ChickenFur
masz rację
Przesyłam
Prowadzę jednego z moich klientów w ramach AWS od ponad 2 lat ... Kiedy czytam twoje pytanie, jest to pierwsza rzecz, która pojawiła się w mojej głowie jako podejrzana.
Jeremy Bouse,
1
Naprawiono zmianę LB na punkt z 443 na 443 :) Dzięki!
ChickenFur
17

Spróbuj dodać to do swojego httpd.conflub an.htaccess

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

Kiedy używasz modułu równoważenia obciążenia + HTTPS, twój serwer nie wie, że HTTPS jest używany w interfejsie, więc nadal próbuje przekierować na stronę HTTPS, podczas gdy w rzeczywistości HTTPS jest już używany.

Powyższe spowoduje przetłumaczenie nagłówka wysyłanego przez moduł równoważenia obciążenia Amazon ( X-Forwarded-Proto: https) na zmienną środowiskową zrozumiałą dla Wordpress i innych skryptów PHP ( HTTPS=1)

AB Carroll
źródło
3
Byłby to właściwy sposób, ponieważ deszyfrowanie SSL pozostaje na ELB
toske
1
Jeśli korzystasz z Nginx, podobny dodatek to:fastcgi_param HTTPS on;
Akash Budhia
Ten post zakończył mój godzinny ból ... THX
Daywalker
3

Według Amazon tutaj https://d0.awsstatic.com/whitepapers/deploying-wordpress-with-aws-elastic-beanstalk.pdf poprawka jest następująca:

/** 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';}

Nadal skończyłem z niekończącą się pętlą, więc zmieniłem konfigurację WordPress od:

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

do:

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

Zmusi to użytkowników do korzystania z https, nawet jeśli wpisają http, a także ułatwi rozwój witryny offline, ponieważ po prostu zaktualizujesz WP_HOME do lokalnego hosta, a https nie jest już domyślnym

brianlmerritt
źródło
1

Cytując siebie w innym pomocnym poście https://serverfault.com/a/858308/450836 :

Dla mnie wystarczyło ustawić $ _SERVER ['HTTPS'] = 'on'; w wp-config.php. Używam AWS ELB, który kończy SSL na ELB. Dlatego nginx akceptuje żądanie na porcie 80 (8080 po lakierowaniu) i wydaje się, że wordpress nie był w stanie sobie z tym poradzić, dopóki jawnie nie poinformujesz PHP, że strona już używa https ...

W przypadku odbiornika ELB nieobsługującego protokołu SSL używam osobnej konfiguracji, aby przekierować cały ruch do https jako domyślnego odbiornika.

Tim
źródło
0

Jak sugerował @Tim, to $_SERVER['HTTPS']='on';w wp-config.php załatwiło sprawę .

Dodałem to również do mojego pliku .htaccess, aby wymusić 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]
Jordania
źródło
0

Naprawiono zbyt wiele problemów z przekierowaniem w AWS ALB

Włącz moduł nagłówka, a następnie dodaj następujący wpis w konfiguracji apache

SetEnvIf X-Forwarded-Proto „https” HTTPS = na RequestHeader ustaw HTTPS „na” env = HTTPS

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
George Ulahannan
źródło