2014-02-18 33 views
1

時,我有一個節點明確應用程序運行在一個代理,使用Apache的ProxyPass打破(在httpd.conf配置):節點快報:res.redirect使用代理

ProxyPass /nodeapp http://localhost:9009 

我的應用程序使用Passport來驗證用戶身份,所以當我訪問的基本路徑,我應該被重定向到登錄頁面:

- 老重定向:http://example.com:9009 - >http://example.com:9009/login

- 新重定向:http://example.com/nodeapp - >http://example.com/nodeapp/login

不幸的是,重定向不工作:

- 碎重定向:http://example.com/nodeapp - >http://example.com/login

我試圖讓快遞代理配置,但是這並沒有區別:

app.enable('trust proxy'); 

**編輯:** Ethan在下面的評論中建議,我可以硬編碼我所有的路徑以適應新的環境,然而這會在我的本地計算機上以根目錄('/')運行時破壞路徑。

我在尋找更集中的解決方案,如果可能的話,它可以適應不同的運行環境?

+0

它看起來像你沒有重定向到正確的頁面。您的新應用根植於'/ nodeapp',但您嘗試重定向到'/ login'。在Passport中,您可以提供'successRedirect'和'failureRedirect'路徑......您需要那些以'/ nodeapp'開頭的路徑。 –

+0

感謝Ethan,在遠程服務器上使用我的應用程序時,您的解決方案爲我工作。但是,當我在本地機器上運行應用程序時,路徑現在不正確。我正在尋找更適合不同運行時環境的更集中的解決方案? – fabritw

回答

1

爲了雙向工作,您需要計算每個請求的代理路徑或本地路徑。

我正在使用Nginx代理,它注入了「x-forwarded-for」和「x-forwarded-proto」(oringinal請求的協議)。轉儲「req.headers」以查看您的代理可能傳遞的標頭。

路線之前,您的快速配置創建此:

app.use(function(req, res, next) { 

    if (req.headers.hasOwnProperty('x-forwarded-for')) { 
    // proxy in effect 
    req.redirUrl = req.headers['x-forwarded-proto'] 
     + "://" 
     + req.headers.host // proxy 
     // plus any proxy subdirs if needed 
     + "/" 
     + proxy_subdir 
    ; 

    } else { 
    // direct requeset 
    req.redirUrl = req.protocol 
     + "://" 
     + req.headers.host 
    ; 
    } 

    next(); 
}); 

您現在有一個req.redirUrl您可以在任何重定向開始使用,這將在代理或直接進入工作:

res.redirect(req.redirUrl + "/redir_path");