我在一台机器上运行一个厨师服务器(在端口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反向代理配置?它是厨师服务器中的配置选项吗?或其他什么?
答案 0 :(得分:1)
我认为你只需要添加:
RequestHeader set X-Forwarded-Proto "https"
到您的Apache配置。
这使得Apache将X-Forwarder-Proto: https
标头添加到Chef / Merb服务器的所有请求中。 Merb在决定是否应将请求视为安全时检查此标头(您可以按照options[:protocol] ||= request.protocol
中的absolute_url
至request#protocol
至request#ssl?
的请求进行检查。
ProxyPassReverse
指令仅更改后端的标头,它不会更改任何内容(需要解析和识别内容中的URL)。传递此标头允许Merb知道它应该像请求使用SSL一样,并根据需要创建链接。