我想讓我的網站的某些頁面只能通過https訪問。我認爲可以在page.erl中識別協議,然後重定向到 正確的URL。類似於如何使用氮氣獲取頁面的完整URL?
case Protocol of
http -> wf:redirect('https://' ++ UrlWithNoProtocol);
_ -> ok
end
當然,我可以通過「://」將URL和UrlWithNoProtocol簡單分割。但事情是,我不知道:如何獲得完整的網頁網址?
我想讓我的網站的某些頁面只能通過https訪問。我認爲可以在page.erl中識別協議,然後重定向到 正確的URL。類似於如何使用氮氣獲取頁面的完整URL?
case Protocol of
http -> wf:redirect('https://' ++ UrlWithNoProtocol);
_ -> ok
end
當然,我可以通過「://」將URL和UrlWithNoProtocol簡單分割。但事情是,我不知道:如何獲得完整的網頁網址?
我response on the Nitrogen Mailing list,這裏複製因漂亮markdownish格式:
我會做兩之一這方面,二者均意味着將氮背後像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插入)。
proxy_set_header X-Forwarded-SSL on;
然後,你可以檢查與WF頭的存在:
例如,你可以在你的「SSL」部分在nginx的配置,設置像頭添加一個規則頭( x_forwarded_ssl)。
如果你不使用反向代理,那麼最簡單的檢查可能是通過獲取請求,則插座端口來檢查網站被送達哪個端口
Req = wf_context:request_bridge(),
Port = Req:peer_port().
然後,檢查簡單地說如果端口是80,它是http,如果它是443,那麼它是https。
就我個人而言,我會選擇nginx解決方案,因爲在任何縮放比例下,通過添加額外的服務器並讓nginx爲您執行負載平衡和ssl處理來簡單擴展將會很好。
我做拉請求simple_bridge, 因爲peer_port是錯誤的牛仔:)
peer_port(ReqKey) ->
?GET,
{Port, NewReq} = cowboy_http_req:port(Req),
NewRequestCache = _RequestCache#request_cache{request=NewReq},
?PUT,
Port.
乾杯!
Thanks Maxim!公認! – chops