Apache反向HTTP代理后面的Chef API服务器返回http而不是https链接

时间:2012-01-30 22:46:18

标签: ruby apache chef merb

我在一台机器上运行一个厨师服务器(在端口4000上监听),我想通过SSL访问它。我已经设置了一个Apache反向代理来执行此操作(侦听端口4001)。 Apache设置看起来像(我的机器名称替换为www.example.com)

Listen 4001

<VirtualHost *:4001>

   SSLEngine on
   SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
   SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

   ProxyRequests     Off
   ProxyPreserveHost On

   <Proxy http://localhost:4000*>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass         /  http://localhost:4000/
   ProxyPassReverse  /  http://localhost:4000/
   ProxyPassReverse  /  http://www.example.com:4000/
   ProxyPassReverse  /  http://www.example.com:4001/

   CustomLog ${APACHE_LOG_DIR}/chef.access.log common
   ErrorLog ${APACHE_LOG_DIR}/chef.error.log

</VirtualHost> 

问题是,厨师API调用返回的JSON中的URL有http而不是https。例如,它们看起来像:

http://www.example.com:4001/sandboxes/a25fa2615d3d4dbd91e91a5e3a76c0ea

而不是:

https://www.example.com:4001/sandboxes/a25fa2615d3d4dbd91e91a5e3a76c0ea

一个例子是对/sandboxes进行POST以创建新的沙箱,该沙箱创建了上面的链接。这就像试图用刀上传食谱一样。

据我所知,/sandboxes POST调用的厨师服务器create method调用Merb absolute_url帮助程序方法来生成URL。

此时,我对如何解决这个问题感到困惑。我是否需要以某种方式更改我的Apache反向代理配置?它是厨师服务器中的配置选项吗?或其他什么?

1 个答案:

答案 0 :(得分:1)

我认为你只需要添加:

RequestHeader set X-Forwarded-Proto "https"

到您的Apache配置。

这使得Apache将X-Forwarder-Proto: https标头添加到Chef / Merb服务器的所有请求中。 Merb在决定是否应将请求视为安全时检查此标头(您可以按照options[:protocol] ||= request.protocol中的absolute_urlrequest#protocolrequest#ssl?的请求进行检查。

ProxyPassReverse指令仅更改后端的标头,它不会更改任何内容(需要解析和识别内容中的URL)。传递此标头允许Merb知道它应该像请求使用SSL一样,并根据需要创建链接。