簡體   English   中英

如何使用 Scotty / wai 在代理后面記錄真實 IP 地址

[英]How to log the real IP address when behind a proxy using Scotty / wai

這是我的 scotty 應用程序,請注意我如何將請求記錄到控制台:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger

import Data.Monoid (mconcat)

main = scotty 3000 $ do
    --log requests to console
    middleware logStdoutDev

    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

我的 scotty 應用程序使用代理機制在 nginx 后面運行。 這會導致 scotty 應用程序記錄如下:

127.0.0.1 - - [27/Aug/2014:15:12:00 +0000] "GET / HTTP/1.0" 200 - ...

我希望記錄真實 IP 地址

我在 Node.js/Express 應用程序中遇到了同樣的問題,我是這樣解決的:

Express.js:如何獲取遠程客戶端地址

我如何在 Scotty 中解決這個問題?

wai-extra有一個IPAddrSource數據類型,它起源於wai-logger包。 因此,如果您希望 IP 地址來自標頭,看起來您可以執行以下操作:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger

import Control.Monad.IO.Class
import Data.Monoid (mconcat)
import Data.Default

main = scotty 3000 $ do
    --log requests to console
    logger <- liftIO $ mkRequestLogger def { outputFormat = Apache FromHeader }
    middleware logger

    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

從描述來看, Apache FromFallback也將首先檢查標頭,如果找不到標頭,則使用套接字 IP 地址。

更新

您也可以在scotty函數之外創建記錄器:

main = do
    logger <- mkRequestLogger def { outputFormat = Apache FromHeader }
    scotty 3000 $ do
        middleware logger

        get "/:word" $ do
            beam <- param "word"
            html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM