如何获取含氮的页面的完整URL?

时间:2012-10-31 16:39:57

标签: url erlang nitrogen

我想仅通过https使我的网站的某些页面可用。我认为可以在page.erl中识别协议然后重定向到 正确的网址。像

这样的东西
case Protocol of
    http -> wf:redirect('https://' ++ UrlWithNoProtocol);
    _ -> ok
end

当然,我可以通过"://"将Protocol和UrlWithNoProtocol简单地分开。但问题是,我不知道:如何获得页面的完整URL?

2 个答案:

答案 0 :(得分:2)

我向simple_bridge提出了拉取请求, 因为牛仔上的peer_port错了:)

peer_port(ReqKey) ->
    ?GET,
    {Port, NewReq} = cowboy_http_req:port(Req),
    NewRequestCache = _RequestCache#request_cache{request=NewReq},
    ?PUT,
    Port.

干杯!

答案 1 :(得分:1)

我的response on the Nitrogen Mailing list,由于标记格式很好而在此重复:

我会这两种方式中的一种,这两种方式都意味着将氮置于像Nginx这样的反向代理之后。

第一种方法是在nginx中使用简单的重写规则来强制某些页面使用SSL。例如,在nginx中,如果要将所有以/ admin开头的请求重定向到HTTPS,可以在HTTP部分中执行此操作。

location ^~ /admin {
     rewrite ^ https://$http_host$request_uri? permanent;
}

您可以阅读有关配置nginx以通过SSL运行的信息(一直在底部):https://github.com/nitrogen/nitrogen_core/blob/master/doc/org-mode/config.org

下一个替代方案是(再次)将氮置于反向代理之后,但这一次,检查是否存在表示请求是安全的标头(此标头将由nginx插入)。

例如,您可以在nginx配置的'ssl'部分添加规则,设置如下标题:

proxy_set_header X-Forwarded-SSL on;

然后你可以用wf:header(x_forwarded_ssl)检查标头是否存在。

如果您没有使用反向代理,那么最简单的检查可能是通过获取请求来检查网站的服务端口,然后是套接字端口

Req = wf_context:request_bridge(),
Port = Req:peer_port().

然后,检查只是端口是80,它是http,如果它是443,那么它是https。

就个人而言,我选择使用nginx解决方案,因为在任何程度的扩展中,通过添加额外的服务器并让nginx为您执行负载平衡和ssl处理来扩展是很好的。