Мой вопрос похож на вот этот, за исключением того, что у меня есть другой сервер nginx за прокси-сервером nginx ssl:
-------------------------- -------------------------------- ----------
| nginx: https://bla.com | -----> | nginx: http://localhost:8080 | ----> | Joomla |
-------------------------- -------------------------------- ----------
Есть ли аналогичный вариант для SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on
в nginx?
В настоящее время у меня проблема, что статический контент, такой как файлы javascript и css, не обслуживается.
Конфигурация внешнего прокси nginx:
server {
listen 443;
listen [::]:443 ipv6only=on;
server_name bla.com;
// cut ssl settings
location / {
proxy_set_header Host $host;
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 $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://bla.com;
}
}
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name bla.com www.bla.com;
return 301 https://bla.com$request_uri;
}
Насколько я понимаю, мне нужно оценить заголовок "X-Forwarded-Proto" во "внутренней" конфигурации nginx и установить HTTPS
переменная окружения, поэтому joomla может реагировать соответствующим образом (library/joomla/uri/uri.php
):
// Determine if the request was over SSL (HTTPS).
if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off'))
{
$https = 's://';
}
else
{
$https = '://';
}
Я просто не знаю как :)
После долгих исследований я нашел решение. Во «внутренней» конфигурации nginx:
http {
...
map $http_x_forwarded_proto $context {
https on;
default off;
}
...
server {
...
location ~ \.php$ {
...
fastcgi_param HTTPS $context;
...
}
}
}
Ссылки: этот намек в списке рассылки nginx привели меня к решению.