使用X-Forwarded-Proto进行https重定向循环

时间:2013-01-21 15:21:05

标签: apache https centos varnish

我们正在构建一个新的服务器: 磅 - >清漆 - > Apache - > CentOS的。

由于Varnish在SSL中不起作用,我们在Pound中将“X-Forwarded-Proto”设置为“https”,如果我们使用https,我们就会检测到这种情况。

当我们直接访问类似https://example.com的网址时,它正在工作,但是当我们使用“htaccess”或“PHP”从“http”重定向到“https”时,它不起作用。似乎X-Forwarded-Proto没有通过重定向转发。所以我们陷入无限重定向循环。

我们已经找到了一种使用javascript执行重定向的方法,但我们希望有一个服务器端解决方案。

所以我们想知道是否有改变apache,pound,varnish等的设置?

我们尝试了很多解决方案,如:

////////////////
// htaccess
////////////////////
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule (.*) https://example.com [L,R]


///////////////////
// php 
//////////////////
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
    $_SERVER['HTTPS']='on'; 
}

if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on'){
    header('Location: '. 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}

Our pound config look like:

//////////////////
// pound
///////////////
ListenHTTPS

      Address 0.0.0.0 # all interfaces
      Port 443
      AddHeader "X-Forwarded-Proto: https"
      HeadRemove "X-Forwarded-Proto"
      HeadRemove "X-Forwarded-For"
      Cert "/path/to/certificate.pem

      Service
            BackEnd
                  Address 10.0.0.1
                  Port 80
                  Priority 1
            End

      End
End

由于帮助了我们,我们在这个问题上花了很多时间!

2 个答案:

答案 0 :(得分:3)

如上所述:

  

我们必须:

     
      
  • RewriteLocation 0放入ListenHTTPs
  •   
  • 修复配置中的域名问题
  •   
ListenHTTPS

  ReWriteLocation 0

答案 1 :(得分:0)

就我而言,Varnish已配置为规范化URL并删除了方案和域:

set req.url = regsub(req.url, "^http[s]?://[^/]+", "");

这样,http://example.comhttps://example.com的重定向响应就会被缓存,而https://example.com的请求会返回此缓存的响应。

删除此规范化或添加

hash_data(req.http.Https);

sub vcl_hash帮助。