我想让我网站的某些页面只能通过 https 访问。我认为可以在 page.erl 中识别协议,然后重定向到正确的 URL。就像是
case Protocol of
http -> wf:redirect('https://' ++ UrlWithNoProtocol);
_ -> ok
end
当然,我可以通过“://”简单地将 URL 拆分为 Protocol 和 UrlWithNoProtocol。但问题是,我不知道:如何获取页面的完整 URL?
我向simple_bridge提出了拉取请求,因为 peer_port 在 Cowboy 上是错误的 :)
peer_port(ReqKey) ->
?GET,
{Port, NewReq} = cowboy_http_req:port(Req),
NewRequestCache = _RequestCache#request_cache{request=NewReq},
?PUT,
Port.
干杯!
我在 Nitrogen Mailing list 上的回复,由于漂亮的降价格式,在此重复:
我会选择两种方法中的一种,它们都意味着将 Nitrogen 放在像 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 处理来简单地扩展会很好。