2017-04-25 11 views
1

Ich suche Knoten (mit Express für Routing), um alle Vorkommen der ../ Symbol in URLs vor dem Ausführen eines beliebigen Routing auf der URL zu lösen.Knoten, Express, Prozess ".." Symbol in der URL

Zum Beispiel, wenn Apache an der URL /a/b/../c/d/e/../../f abgefragt wird, wird es zuerst alle ../ Symbole auflösen und wird schließlich jeden Inhalt liefern, der bei /a/c/f gelegen ist.

Mit Knoten + Express wird jedoch /a/b/../c/d/e/../../f wörtlich genommen und entspricht nicht Routing für /a/c/f. Mein Problem ist, dass der folgende Code auf eine Anfrage nicht wie /a/b/../c/d/e/../../f reagiert:

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

Wie kann ich Knoten + ausdrücken ../ Symbole in der URL zu lösen?

+1

... warum ein Downvote? :( –

Antwort

1

können Sie den Pfad-Modul verwenden, um die URL-Segmente zu verbinden:

const path = require("path"); 

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

es auf die URL neu zuordnen können jede nachfolgende ausdrückliche es weiterhin Matcher Verarbeitung, ohne etwas zu dienen, die manuelle Steuerung zu nehmen.

+0

Ich bin viel mehr geneigt zu ändern 'req.url' als ich umleiten soll, so sieht das gut aus! Aber wie ich @strah fragte - ist es sicher, "path" als URL-Dienstprogramm zu verwenden, wenn man bedenkt, dass es für Dateipfade gedacht ist? –

+0

Das Pfadmodul ist nur ein Werkzeug wie jedes andere. Vorausgesetzt, dass Sie die URL als Dateipfad verwenden wie auch immer, es ist perfekt dafür geeignet – cdbajorin

+0

Ich will nicht pingelig klingen - ich gebe dir den Check-in, aber gibt es noch andere Nebenwirkungen, die ich von 'path.join' erwarten darf? Ich bin mir sicher, dass es sowohl das '. /' Symbol als auch das '../' Symbol verarbeiten wird (was ich nicht verlangt habe, aber das ich kein Problem!) Ich möchte nur wissen, ob es noch andere Fälle gibt. –

1

Versuchen Zugabe (begore ersten app.get(...)) dieser Middleware:

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(); 
    } 
}); 

Dies sollte nicht als ausdrückliche + Knoten benötigt werden, sollten Wege lösen, wie man erwarten würde.

+1

Ich denke, das ist, was ich suche! Ist es sicher, 'Pfad' als URL-Dienstprogramm zu verwenden? Ich war unter dem Eindruck, es war besonders auf Dateipfade ausgerichtet. –

+0

Sie möchten vielleicht sehen [ url] (https://nodejs.org/api/url.html) Modul, stattdessen hat es ähnliche Methoden – strah