2017-04-25 26 views
1

我正在尋找在使用url執行任何路由之前,先解析節點(使用express進行路由)以解析所有出現在url中的../符號。節點,表達,處理URL中的「..」符號

例如,如果通過url /a/b/../c/d/e/../../f查詢apache,它將首先解析所有../符號,並最終提供位於/a/c/f的任何內容。

然而,使用節點+ express,/a/b/../c/d/e/../../f是字面意思,並且不會匹配路由/a/c/f。我的問題是,下面的代碼不會像/a/b/../c/d/e/../../f請求做出迴應:

app.get('/a/c/f', function(req, res) { 
    return res.status(200).json({ msg: 'it worked!' }); 
}); 

我怎樣才能得到節點+表達的URL來解決../符號?

+1

...爲什麼downvote? :( –

回答

1

您可以使用該路徑模塊加入URL段:

const path = require("path"); 

app.use(function(req, res, next) { 
    const pathArr = req.url.split("/"); 
    req.url = path.join.apply(null, pathArr); 
    next(); 
}); 

重新分配給的網址將允許任何後續快遞匹配器繼續,而無需採取任何服務的手動控制處理它。

+0

我更傾向於改變'req.url'比我重定向,所以這看起來不錯!但是正如我問@strah - 考慮它是用於文件路徑,是否可以使用'path'作爲一個url實用程序? –

+0

路徑模塊只是一個工具,就像任何其他工具一樣,假設你使用url作爲文件路徑無論如何,它是完全適合它 – cdbajorin

+0

我不想聽起來nitpicky - 我會給你亞檢查在一瞬間!但是有任何其他副作用,我應該期望從'path.join'?例如我相信它會處理'。/'符號以及'../'符號(我沒有要求,但是我會不會有問題!)我只想知道除了這種情況之外是否還有其他問題。 –

1

嘗試增加(begore第一app.get(...))這個中間件:

var path = require('path'); 

// some other code 

app.use(function(req, res, next) { 
    var parsedPath = path.resolve(req.path); 
    var root = req.protocol + '://' + req.get('Host'); 
    var redir = path.join(root, parsedPath); 
    console.log(redir); 
    if (parsedPath !== req.path) { 
    res.redirect(parsedPath); 
    } else { 
    next(); 
    } 
}); 

這應該是不需要作爲快遞+節點應該可以解決你所期望的路徑。

+1

我認爲這就是我要找的!!使用'path'作爲一個url工具是否安全?我的印象是它特別適用於文件路徑 –

+0

你可能想看看[ url](https://nodejs.org/api/url.html)模塊,它有類似的方法 – strah