1

我有一台在机器上运行的厨师服务器(侦听端口 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

一个示例是在执行 POST 以/sandboxes创建新沙箱时,该沙箱创建了上面的链接。这会破坏诸如尝试使用刀上传食谱之类的事情。

据我所知,POST 调用的厨师服务器创建方法调用Merb absolute_url辅助方法来生成 URL。/sandboxes

在这一点上,我很困惑如何解决这个问题。我是否需要以某种方式更改我的 Apache 反向代理配置?它是厨师服务器中的配置选项吗?或者是其他东西?

4

1 回答 1

1

我认为您只需要添加:

RequestHeader set X-Forwarded-Proto "https"

到您的 Apache 配置。

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

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

于 2012-01-31T03:06:11.943 回答