19

Is it possible to rewrite the URL path using node.js?(I'm also using Express 3.0)

I've tried something like this:

req.url = 'foo';

But the url continues the same

0

3 Answers 3

47

Sure, just add a middleware function to modify it. For example:

app.use(function(req, res, next) {
  if (req.url.slice(-1) === '/') {
    req.url = req.url.slice(0, -1);
  }
  next();
});

This function removes the trailing slash from all incoming request URLs. Note that in order for this to work, you will need to place it before the call to app.use(app.router).

Sign up to request clarification or add additional context in comments.

7 Comments

I think it is working fine, but the path on the browser continues the same... Is it possible to rewrite the URL on the user browser too or just using res.redirect ?
If you want to modify the URL in the browser, I think you need to redirect the user. See the answer and comments here.
In Express 4 (and maybe earlier), this no longer works. The Request instance defines the req property as not writable.
@PhpMyCoder could you add an answer showing how to do this in more modern versions? I haven't been using express for a while so I'm not sure how to fix this.
Turns out I can't read. For some reason when I skimmed over this question I read req.path not req.url. req.url is a property of Http.IncomingMessage so it can be set. Your original answer was correct. My apologies!
|
2

A good idea should be to update the path too. My method suggestions:

app.use(function(req, res, next) {
    console.log("request", req.originalUrl);
    const removeOnRoutes = '/not-wanted-route-part';
    req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
    req.path = req.path.replace(removeOnRoutes,'');
    return next();
});

By this way /not-wanted-route-part/users will became /users

1 Comment

in [email protected] i get the following TypeError: Cannot set property path of #<IncomingMessage> which has only a getter
1

you need override some properties of req (IncomingMessage in NodeJs):

  • url
  • path
  • search
  • query

2

function changeUrl(req, url) {
    const parsedUrl = new URL(url);
    req.url = url;
    req.originalUrl = url;
    req.path = parsedUrl.pathname;
    req.search = parsedUrl.search;
    req._parsedUrl = parsedUrl;
    const query = {};
    for(const entry of parsedUrl.searchParams) {
        query[entry[0]] = entry[1];
    }
    req.query = query;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.