Nginx - как включить ssl для PHP за обратным прокси

У меня есть установка, которая выглядит примерно так (я постарался максимально упростить это):

Порт 443 - nginx слушает и перенаправляет на порт 80, конфиг выглядит примерно так

server {
  listen 443 ssl;
  location / {
  proxy_pass http://127.0.0.1:80;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-Port 443;
  proxy_set_header Host $host;
}

Порт 80 - Varnish (обратный прокси-сервер), который перенаправляет трафик на порт 8080, если нет попадания в кэш.

настройка 8080 порта nginx для PHP с fastcgi. У меня есть несколько общих настроек:

location ~ \.php$ {
  ...
  include fastcgi_params;
}

и файл fastcgi_params, который выглядит следующим образом

...
fastcgi_param   HTTPS           $https if_not_empty;

То, что я пытался сделать, это создать настройку, где nginx при прослушивании через порт 8080 может определить, обслуживает ли он контент по http или https. Он должен сообщить об этом PHP, чтобы он мог создавать URL с правильной схемой.

Я думал, что где-то я должен слушать X-Forwarded-Proto а затем скажите nginx, что https включен. Я не знаю, как / где сделать какое-то утверждение if, если что-то подобное возможно, или как сказать nginx, что https должен быть включен.

1 ответ

Вы можете решить это двумя способами... на уровне приложения или на уровне Nginx.

На уровне приложения

Поскольку это PHP-приложение, вы можете использовать следующее в верхней части кода / приложения...

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';

На уровне Nginx

Шаг 1: сопоставьте X-Forwarded-Proto с переменной, значение которой зависит от X-Forwarded-Proto.

map $http_x_forwarded_proto $fastcgi_param_https_variable {
    default '';
    https 'on';
}

Шаг 2: заменить существующую линию fastcgi_param HTTPS $https $if_not_empty со следующей строкой, которая устанавливает fastcgi_param HTTPS на основе вышеуказанной переменной

fastcgi_param HTTPS $fastcgi_param_https_variable;

Лично я предпочитаю первый метод, так как для правильной настройки требуется всего одна строка. Второй метод тоже должен работать, но не проверен.

Другие вопросы по тегам