ReaperSoon
ReaperSoon

Reputation: 839

Express redirect wrong url

When use express res function redirect(url), i'm redirected to the wrong url !

My website URL is mywebsite.com :

function myroute(app) {
    app.get(/route, function(req, res) {
        var url = getMyUrl();
        console.log(url); // https://otherwebsite.com/foo?bar=baz [OK]
        res.redirect(url); // redirect to https://mywebsite.com/foo?bar=baz [WRONG!]
    });
}

I don't know why express redirect to mywebsite.com with good parameters instead of otherwebsite.com

No idea why...

This bug occurs on production. On my develop environment the redirect URL is the good url.

Thanks in advance

EDIT

I also tried with:

res.location(url);

and

res.setHeader(302, {Location: url});

But it always redirect to the wrong URL... My url variable is good but I receive this header response:

HTTP/1.1 302 Found
X-Powered-By: Express
Location: https://mywebsite.com/foo?bar=baz
Vary: Accept\r\nContent-Type: text/html; charset=UTF-8
Content-Length: 170
Date: Fri, 13 Jul 2018 21:52:18 GMT
Connection: keep-alive

EDIT 2

Ok more tests here :

res.redirect("https://www.google.fr/toto?key=value"); // https://mywebsite.com/toto?key=value **[fail]**

res.redirect("https://www.google.fr/toto"); // https://mywebsite.com/toto **[fail]**

res.redirect("https://www.google.fr"); // https://www.google.fr **[success]**

It seems to not redirect to the domain I want if I add a path. Any idea ?

EDIT 3

Maybe it's caused by my vhost ?

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mywebsite.com

ProxyRequests     Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5001/
<Location />
    ProxyPassReverse /
    Order deny,allow
    Allow from all
</Location>

SSLCertificateFile ...
SSLCertificateKeyFile ...
</VirtualHost>
</IfModule>

Upvotes: 1

Views: 2082

Answers (2)

Nacho
Nacho

Reputation: 36

Providing an actual answer this time, as my previous one was (rightfully so) deleted.

The incorrect URL redirections are definitely caused by:

ProxyPassReverse /

As this is what such directive does:

"lets Apache httpd adjust the URL in the Location, Content-Location and URI headers on HTTP redirect responses."

In my case, removing this directive was causing other internal redirection issues in my application, so I was trying to find out a way to add exceptions to it.

However, it turns out I never needed ProxyPassReverse (only ProxyPass) if I adjust the 'mountpath' of my Express node js configuration to match the path of the proxy server. Not sure if this answer will help you as an actual solution, but it managed to solve it on my node application using Apache as reverse proxy.

Upvotes: 2

Mike Mulligan
Mike Mulligan

Reputation: 198

I believe 301 needs to be included.

Try changing res.redirect(url) to res.status(301).redirect(url) and see if it fixes the issue.

Upvotes: 2

Related Questions