Назад | Перейти на главную страницу

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 должен быть включен.

Вы можете решить эту проблему двумя способами ... на уровне приложения или на уровне 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;

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