Как сделать перенаправление nginx на основе значения заголовка?
Я размещаю сайт за прокси-сервером Cloudflare, что означает, что все запросы на мой сервер превышают порт 80, хотя Cloudflare обрабатывает трафик HTTP (порт 80) и HTTPS (порт 443).
Чтобы различать эти два, Cloudflare включает заголовок X-Forwarded-Proto
, который настроен на "http" или "https" на основе пользовательского соединения.
Я хотел бы перенаправить каждый запрос с заголовком X-Forwarded-Proto: http
на версию SSL моего сайта. Как я могу достичь этого с помощью конфигурации nginx?
Ответы
Ответ 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...