Przekieruj pętlę za pomocą elastycznego ssl cloudflare

11

Próbuję wdrożyć elastyczny protokół SSL zapewniany przez CloudFlare w mojej witrynie.

Oto moja konfiguracja Nginx:

# 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...)

Jednak gdy próbuję połączyć się z witryną (Wordpress), pojawia się pętla przekierowań (chrome: ERR_TOO_MANY_REDIRECTS). Jak skonfigurować nginx, aby temu zapobiec?

Deqq
źródło

Odpowiedzi:

31

Elastyczny ssl Cloudflare oznacza, że ​​połączenie między Cloudflare a twoim serwerem odbywa się zawsze przez http:

połączenie jest zawsze http

Biorąc to pod uwagę - jedynym blokiem serwera w kwestii istotności jest ten:

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

Powinno być oczywiste, dlaczego powoduje to pętlę przekierowania, istnieją 2 rozwiązania, aby wymusić połączenia https przy użyciu ich elastycznego rozwiązania ssl.

Użyj reguł strony Cloudflare

Jeśli dostęp do serwera odbywa się wyłącznie za pośrednictwem cloudflare, możesz użyć własnych reguł strony w celu zmodyfikowania odpowiedzi dla domeny, subdomeny lub dowolnego wzorca adresu URL:

Korzystanie z reguł strony dotyczących cloudflare

Jedną z opcji jest wymuszenie https:

Zawsze używaj HTTPS

Test $http_x_forwarded_proto

Czasami możesz chcieć uniknąć używania reguł strony (powinno to być rzadkie lub przejściowe), w tych scenariuszach można przetestować przesłany protokół i przekierować na podstawie:

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
źródło
I czy w moich połączeniach https wystąpią błędy, takie jak, że w tym przypadku nie wszystko jest przesyłane przez http?
Deqq,
Sposób konfiguracji cloudflare / nginx nie ma na to wpływu, zawartość HTML określa, czy zgłaszane są takie błędy.
AD7six,
Pierwszy wiersz tej odpowiedzi jest niepoprawny: połączenie między przeglądarką a CloudFlare jest szyfrowane TLS, połączenie z CloudFlare do serwera źródłowego to http. Pętle przekierowania mogą być spowodowane regułami strony lub ustawieniem wysokiego poziomu niepoprawnie określającym typ szyfrowania - np. Pełnym, gdy naprawdę potrzebujesz elastyczności.
Tim
Jest też wtyczka, która pomaga w tym: en-nz.wordpress.org/plugins/cloudflare-fiętka-ssl
Tim
6

To może rozwiązać problem, jeśli masz ważny certyfikat SSL. [Crypto] i wybierz Full (strict)jak na obrazku. wprowadź opis zdjęcia tutaj

Naprawdę nie trzeba aktualizować pliku konfiguracyjnego serwera WWW dla Nginx.

prosti
źródło
Pełna (ścisła) działa tylko wtedy, gdy pierwotny serwer WWW ma prawidłowy certyfikat SSL z prawidłowym łańcuchem certyfikatów. Pełna praca z dowolnym certyfikatem SSL, w tym z podpisem własnym. To nie jest dobra odpowiedź na pytanie.
Tim
Tak, widzę teraz, pytanie dotyczyło certyfikatu elastycznego. Poprawię swoją odpowiedź dzięki twojej opinii i będę bardziej szczegółowy. Ulepszamy tutaj bazę wiedzy. Ważny certyfikat SSL ma najlepszą wartość dla Google, jeśli weźmiemy pod uwagę SEO. Po opublikowaniu tego nie żałuję.
prosti
Elastyczny / pełny / ścisły nie ma znaczenia dla SEO, to ustawienie dotyczy połączenia z serwerem źródłowym. Cloudflare przedstawia wspólny certyfikat https każdemu, kto zażąda strony, sposób, w jaki łączy się on z początkiem, jest w dużej mierze nieistotny.
Tim
Zakładając, że serwer nie posiada ważnego cert SSL (OP nie precyzuje, a ja przyszedłem tutaj poprzez podobny config google), to jest świetnym rozwiązaniem - uwaga może też być zawężona do danej subdomeny poprzez stronę Regulaminu.
skoczen
To dla mnie bardzo dobra odpowiedź, która miała prawidłowy protokół SSL.
Philip
0

Odpowiedź AD7six jest bardzo dobra, choć wydaje się, że istnieje prostsze rozwiązanie, które nie wymaga reguł strony. Nie jestem pewien, czy jest to nowy dodatek od poprzednich odpowiedzi, ale zdecydowanie należy to udokumentować na tym pytaniu, zwłaszcza biorąc pod uwagę, że w momencie pisania Cloudflare otrzymujesz tylko 3 bezpłatne reguły strony.

Po włączeniu elastycznego protokołu SSL dla danej domeny możesz przewinąć Cryptokartę w dół i włączyć tę Always use HTTPSopcję. Ta opcja bezproblemowo rozwiąże problem pętli przekierowań (dokładnie wyjaśniony w odpowiedzi AD7six ).

Opcja „Zawsze używaj HTTPS” firmy Cloudflare

Ta opcja jest potwierdzona podczas pracy z nginx; ponadto nie powinno być żadnej konfiguracji serwera, w której ta opcja nie działa, pod warunkiem, że Elastyczny SSL jest już włączony i działa bez problemu.

Czad
źródło
Jeśli interfejs Cloudflare zmienił się (lub udostępniono nowe opcje), lepiej byłoby edytować istniejącą odpowiedź, niż utworzyć konkurencyjną.
AD7six,
@ AD7six Uważam, że jest to dodatek do starego interfejsu użytkownika, a nie zamiennik, co oznacza, że ​​stara odpowiedź powinna być nadal ważna. Dlatego osobna odpowiedź byłaby bardziej logiczna niż edycja oryginału, prawda?
Czad
Nie sądzę: „Musiałeś to robić od dłuższego czasu, ale teraz jest na to przycisk!” to nowa odpowiedź, nie :).
AD7six,