Цикл перенаправления с использованием cloudflare's Flexible ssl


10

Я пытаюсь внедрить гибкий SSL, предоставляемый CloudFlare, на мой сайт.

Вот мой конфиг 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...)

Однако, когда я пытаюсь подключиться к веб-сайту (Wordpress), я получаю цикл перенаправления (chrome: ERR_TOO_MANY_REDIRECTS). Как мне настроить nginx, чтобы предотвратить это?

Ответы:


30

Гибкий ssl Cloudflare означает, что соединение между cloudflare и вашим сервером всегда через http:

соединение всегда http

Учитывая это - единственный блок сервера в вопросе об актуальности это:

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

Должно быть очевидно, почему это приводит к циклу перенаправления, есть 2 решения для принудительного подключения https с использованием их гибкого решения ssl.

Используйте правила страницы Cloudflare

Если доступ к серверу осуществляется исключительно через cloudflare, вы можете использовать собственные правила страницы cloudflare для изменения ответов для домена, субдомена или любого шаблона URL:

Использование правил страницы cloudflare

Одним из вариантов является принудительное использование https:

Всегда используйте HTTPS

Контрольная работа $http_x_forwarded_proto

Есть моменты, когда вы можете избежать использования правил страницы (должны быть редкими или только переходными), для этих сценариев можно протестировать перенаправленный протокол и перенаправить на основе этого:

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
}

И будут ли ошибки в моих соединениях https, например, что не все передается через http в этом случае?
Deqq

То, как вы настраиваете cloudflare / nginx, не имеет к этому никакого отношения, содержание html будет определять, есть ли такие сообщения об ошибках.
AD7six

Первая строка этого ответа неверна: соединение между браузером и CloudFlare зашифровано TLS, соединение между CloudFlare и исходным сервером - http. Циклы перенаправления могут быть вызваны правилами страницы или настройкой высокого уровня, неправильно определяющей тип шифрования - например, полной, когда вам действительно нужна гибкость.
Тим

Есть также плагин, который помогает с этим: en-nz.wordpress.org/plugins/cloudflare-f Flexible-ssl
Тим

5

Это может решить проблему, если у вас есть действующий сертификат SSL. Поле [Crypto] и выберите Full (strict)как на изображении. введите описание изображения здесь

На самом деле нет необходимости обновлять файл конфигурации веб-сервера для Nginx.


Полный (строгий) работает только в том случае, если исходный веб-сервер имеет действительный сертификат SSL с допустимой цепочкой сертификатов. Полноценно работает с любым SSL-сертификатом, включая самоподписанный. Это не очень хороший ответ на вопрос.
Тим

Да, теперь я вижу, в вопросе упоминается гибкий сертификат. Я улучшу свой ответ благодаря вашим отзывам и буду более конкретным. Мы улучшаем базу знаний здесь. Действительный сертификат SSL имеет лучшее значение для Google, если мы рассматриваем перспективу SEO. Я не сожалею после публикации этого.
Прости

Гибкий / полный / строгий не имеет никакого значения для SEO, этот параметр предназначен для подключения к исходному серверу. Cloudflare представляет общий https-сертификат тому, кто запрашивает страницу, как он подключается к источнику, в значительной степени не имеет значения.
Тим

Предполагая , что сервер действительно есть действующий SSL сертификат (ОП не уточняет, и я пришел сюда через аналогичный конфиг Google), это отличный вариант - примечание он также может быть ограничен к определенной подобласти через Правила страницы.
skoczen

Это очень хороший ответ для меня, у которого был действительный SSL.
Филипп

0

Ответ AD7six очень хороший, хотя кажется, что есть более простое решение, которое не требует правил страницы. Я не уверен, является ли это новым дополнением со времени предыдущих ответов, но это определенно должно быть задокументировано по этому вопросу, особенно учитывая, что на момент написания вы получили только 3 бесплатных правила для страниц с Cloudflare.

Если у вас включен протокол Flexible SSL для данного домена, вы можете прокрутить Cryptoвкладку вниз и включить эту Always use HTTPSопцию. Эта опция легко решит проблему с циклом перенаправления (подробно объяснено в ответе AD7six ).

Опция Cloudflare «Всегда использовать HTTPS»

Эта опция подтверждена работой с nginx; кроме того, не должно быть никаких настроек сервера, где эта опция не работает, при условии, что Flexible SSL уже включен и работает без проблем.


Если пользовательский интерфейс Cloudflare изменился (или появились новые опции), было бы лучше отредактировать существующий ответ, чем создавать конкурирующий.
AD7six

@ AD7six Я ​​считаю, что это дополнение к старому пользовательскому интерфейсу, а не замена, что означает, что старый ответ должен быть действительным. Поэтому отдельный ответ был бы более логичным, чем редактирование оригинала, не так ли?
Чад

Я не думаю, что "Раньше вам приходилось делать это далеко, но теперь есть кнопка для этого!" это новый ответ, нет :).
AD7six
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.