Apache反向代理和localhost - "混合内容,内容必须通过HTTPS提供服务"

时间:2017-07-04 08:13:57

标签: node.js apache express proxy reverse-proxy

我为在localhost上运行的节点服务器创建了一个反向代理,以便可以通过HTTPS提供。

转发工作很好,但是当应用尝试发出请求时,我得到了:

  

混合内容:' https://foo.com/'是通过HTTPS加载的,   但是请求了一个不安全的XMLHttpRequest端点   ' http://localhost:8888/graphql?query=%7Bnotifications(userid)%7Bid%2C ...   此请求已被阻止;内容必须通过HTTPS提供。

Vhost配置:

<VirtualHost *:443>
   ServerName www.foo.com
   ServerAlias foo.com
   DocumentRoot /var/www/foo/
   ErrorLog /var/www/foo/error.log
   CustomLog /var/www/foo/requests.log combined

   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   SSLCertificateFile "/etc/letsencrypt/live/foo.com/cert.pem"
   SSLCertificateKeyFile "/etc/letsencrypt/live/foo.com/privkey.pem"

   ProxyPreserveHost On
   ProxyRequests Off
   ProxyPass / http://localhost:8888/
   ProxyPassReverse / http://localhost:8888/

</VirtualHost>

我的设置缺少什么?

2 个答案:

答案 0 :(得分:0)

您需要向node.js应用添加SSL证书。在apache上启用它不会有帮助,因为apache正在将请求转发到端口8888上的node.js应用程序(它在普通的http而不是https上进行通信)。这就是您收到混合内容错误的原因。初始请求在apache上的 https 上,然后转发到 http 到node.js

使用SSL证书配置node.js应用程序的步骤(您可以使用自签名证书或商业证书)。

首先,您必须通过ssl-root-cas使用npm。配置如下:

'use strict';

var https = require('https')
  , cas
  ;

// This will add the well-known CAs
// to `https.globalAgent.options.ca`
require('ssl-root-cas').inject();

cas = https.globalAgent.options.ca;

cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '01-ssl-intermediary-a.pem')));
cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '02-ssl-intermediary-b.pem')));
cas.push(fs.readFileSync(path.join(__dirname, 'ssl', '03-ssl-site.pem')));

试试看是否有效!

答案 1 :(得分:0)

您正在https://foo.com/上打开该页面,但您网页中的网址包含硬编码的localhost域名和端口。在呈现页面时,客户端浏览器将尝试获取'http://localhost:8888/graphql有效地跳过apache(在端口80上运行,在服务器foo.com上)并直接点击您的节点应用程序,这将1)仅在您工作时工作从运行节点应用程序的同一台计算机上运行浏览器,2)即使这样,您也会收到上述错误,因为某些页面资源是使用http加载的。

当您使用相对网址(例如以/开头的网址)时,浏览器会添加基本网址,从而生成https://foo.com/graphql

Absolute vs relative URLs