@MrDimaFIX

Https заменяется на http после прохода через nginx?

Имеется задача: в один docker-контейнер с php-fpm добавить nginx, который будет работать на 80 порту.
Сейчас данный nginx имеет следующую конфигурацию:

server {
        listen 80 default_server;

        root /app/public;

        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options "nosniff";

        index index.html index.php;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        charset utf-8;

        location ~* \.php$ {
            fastcgi_pass                     127.0.0.1:9000;
            fastcgi_index                   index.php;
            include                            fastcgi_params;
            fastcgi_param                  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param                  REQUEST_METHOD $request_method;
        }
    }


Рядом с контейнером php-fpm (с кодом) и nginx запущен ещё один nginx, который является входящим прокси сервером.
Конфиг для данного хоста вот:
server {
    listen 80;
    server_name test.local.host;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name test.local.host;

    ssl_certificate /etc/letsencrypt/live/test.local.host/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.local.host/privkey.pem;

    location / {
        proxy_pass http://php; #php -- имя контейнера, описанного выше
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900s;
        proxy_send_timeout 900s;
    }
}


В чём проблема: при переходе на test.local.host всё работает замечательно (когда выключен redirect на https).
При входе на сайт через https://test.local.host загружается только index.php, а файлы со стилями (как и все остальные) не загружаются браузером, т.к. они пытаются загрузиться по http, а браузер этого не разрешает. При этом если этот же файл открыть через https://test.local.host/js/app.js -- файл открывается нормально.
В какой-то момент, то ли главный nginx, то ли второй, то ли php-fpm решает что он работает по http, и возвращает ссылки на файлы по http протоколу.

Какие возможные варианты решения данной проблемы? Уже несколько дней не подберу рабочей конфигурации.
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
dyuriev
@dyuriev
A posteriori
У вас похоже nginx в контейнере не передает инфу в php-fpm о том что https используется
fastcgi_param REQUEST_SCHEME https;
или (пишу по памяти, пардоньте)
fastcgi_param HTTPS on;

а вообще по классике - создайте файл info.php с содержимым
<?php phpinfo(); ?>
и посмотрите что там прилетает заголовками в php

UPD: если кто пришел с гугла сюда, чтоб не страдали - убрал кавычки лишние, подробности в комментариях
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ТАК НЕЛЬЗЯ ДЕЛАТЬ!
Какой-то идиот написал ман и все маны в интернете ошибочны ( да оно работает но есть множество но)
И это связано именно с тем что бэк не знает что он на https, да есть частичные костыли которые решают большинство косяков ( но не все)
Короче если в кратце
http -> http
https -> https
Подставляете тот же сертификат на бэке
Падения производительности нет.
Придумывать велосипед смысла нет, делайте как положено и все будет хорошо
тот гений что придумал миксовать контент, может и ответит зачем он так придумал но реально от этого решения нет никакой пользы а вот минусы есть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы