※この記事は、下記の経緯の中で作成しました。
docker-composeでNginx+php環境を構築。(そのときの記事はこちら)
HostOSのNginxでHTTPS->HTTPのリバースプロキシを行い、DockerのNginxではHTTPでうける。PHP環境にFuelphpをインストールし、早速welcomeページをブラウザ表示したところ・・・
コンソールに下記が表示。
Mixed Content: The page at 'https://xxxx.jp/' was loaded over HTTPS, but requested an insecure stylesheet 'http://xxxx.jp/assets/css/bootstrap.css?1561651380'. This request has been blocked; the content must be served over HTTPS.
HTTPSサイトなのに、HTTPでCSSををリクエストするのは(混在)NG、というわけ。
こちらの解決策について。
#HostOSのNginx(リバースプロキシ)の設定
こんな感じ。
server {
listen 80;
server_name xxxx.jp;
location / {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
server {
listen 443 ssl;
server_name xxxx.jp;
access_log /var/log/nginx/xxxx.jp/access.log main;
error_log /var/log/nginx/xxxx.jp/error.log warn;
ssl_certificate ssl/xxxx.jp.crt;
ssl_certificate_key ssl/xxxx.jp.key;
location / {
# docker's port
proxy_pass http://localhost:8082;
# https -> http
proxy_redirect http:// https://;
# inherit remote info
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
※Dockerのnginxは8082ポート(HTTP)で受けている。
※proxy_redirect のところでHTTPにプロキシ。
※X-Forwarded-Protoで、クライアントのプロトコル(HTTPS)をx-headerを使って転送先に伝えている。
#原因
welcomeページのCSSの読み込みは・・・
<?php echo Asset::css('bootstrap.css'); ?>
fuelphpの中でプロトコルを判定している箇所は・・・・?
/**
* Return's the protocol that the request was made with
*
* @return string
*/
public static function protocol()
{
if (static::server('HTTPS') == 'on' or
static::server('HTTPS') == 1 or
static::server('SERVER_PORT') == 443 or
(\Config::get('security.allow_x_headers', false) and static::server('HTTP_X_FORWARDED_PROTO') == 'https') or
(\Config::get('security.allow_x_headers', false) and static::server('HTTP_X_FORWARDED_PORT') == 443))
{
return 'https';
}
return 'http';
}
static::server('HTTP_X_FORWARDED_PROTO')は先述のHostOSの設定でtrueできている。
問題は、\Config::get('security.allow_x_headers', false)がfalseになっていること。
→
・x-headerが許可されていない。
・configで設定できるっぽい
#解決策
下記のように直す。
// 'allow_x_headers' => false,
'allow_x_headers' => true,