Подтвердить что ты не робот

Как сделать перенаправление nginx на основе значения заголовка?

Я размещаю сайт за прокси-сервером Cloudflare, что означает, что все запросы на мой сервер превышают порт 80, хотя Cloudflare обрабатывает трафик HTTP (порт 80) и HTTPS (порт 443).

Чтобы различать эти два, Cloudflare включает заголовок X-Forwarded-Proto, который настроен на "http" или "https" на основе пользовательского соединения.

Я хотел бы перенаправить каждый запрос с заголовком X-Forwarded-Proto: http на версию SSL моего сайта. Как я могу достичь этого с помощью конфигурации nginx?

4b9b3361

Ответ 1

Самый простой способ сделать это - с директивой if. Если есть лучший способ, сообщите мне, так как люди говорят, что директива if неэффективна. Nginx преобразует тире в символы подчеркивания в заголовках, поэтому X-Forwarded-Proto становится $http_x_forwarded_proto.

server {
    listen 80;
    server_name example.com; # Replace this with your own hostname
    if ($http_x_forwarded_proto = "http") {
        return 301 https://example.com$request_uri;
    }

    # Rest of configuration goes here... 
}

Ответ 2

Попробуйте использовать директиву карты: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

Что-то вроде этого...

map $http_x_forwarded_proto     $php_backend {
    "https"          "https_php_backend named loc";
    default        "default_php_backend named loc";
}
server{
    location / {
         proxy_pass http://$php_backend;
    }
}

Этот код является абстрактным, но вы можете попробовать tht way...