如何获得含氮网页的完整URL?

如何获得含氮网页的完整URL?,url,erlang,nitrogen,Url,Erlang,Nitrogen,我想让我的网站的某些页面只能通过https访问。我认为可以在page.erl中正确识别协议,然后重定向到 正确的URL。差不多 case Protocol of http -> wf:redirect('https://' ++ UrlWithNoProtocol); _ -> ok end 当然,我可以使用noprotocol简单地将URL拆分为“:/”。但问题是,我不知道:如何获取页面的完整URL?我的,由于良好的标记格式,复制到这里: 我会用两种方法中的一种来

我想让我的网站的某些页面只能通过https访问。我认为可以在page.erl中正确识别协议,然后重定向到 正确的URL。差不多

case Protocol of
    http -> wf:redirect('https://' ++ UrlWithNoProtocol);
    _ -> ok
end
当然,我可以使用noprotocol简单地将URL拆分为“:/”。但问题是,我不知道:如何获取页面的完整URL?

我的,由于良好的标记格式,复制到这里:

我会用两种方法中的一种来做这件事,这两种方法都意味着把氮气放在像Nginx这样的反向代理后面

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

location ^~ /admin {
     rewrite ^ https://$http_host$request_uri? permanent;
}
您可以在以下位置阅读有关配置nginx以通过SSL运行的信息(一直在底部):

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

例如,您可以在nginx配置的“ssl”部分中添加一条规则,该规则设置如下标题:

proxy_set_header X-Forwarded-SSL on;
然后您可以使用wf:header(x_\u ssl)检查报头是否存在

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

Req = wf_context:request_bridge(),
Port = Req:peer_port().
然后,只需检查端口是否为80,是否为http,如果为443,则为https

就我个人而言,我会选择nginx解决方案,因为在任何程度的扩展中,通过添加额外的服务器并让nginx为您进行负载平衡和ssl处理来扩展都是很好的, 因为牛仔身上的对等端口是错误的:)

干杯

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