2012-10-31 33 views
1

我想讓我的網站的某些頁面只能通過https訪問。我認爲可以在page.erl中識別協議,然後重定向到 正確的URL。類似於如何使用氮氣獲取頁面的完整URL?

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

當然,我可以通過「://」將URL和UrlWithNoProtocol簡單分割。但事情是,我不知道:如何獲得完整的網頁網址?

回答

1

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處理來簡單擴展將會很好。

2

我做拉請求simple_bridge, 因爲peer_port是錯誤的牛仔:)

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

乾杯!

+0

Thanks Maxim!公認! – chops