Previously, I discussed javascript appending to query string, where we serialized an associative array to a query string. I would now like to leverage this technique within node.js as a redirect service.
Specifically, I am using express to make a web app in node.js and the app includes a redirect service, e.g.,
var app = express(); var redirectVars = {'foo':'spam and eggs', 'tracker':42 }; // redirect and append redirectVars app.get('/redirect', function(request, result, next) { if(request.query.url) { var urle = request.query.url; var url = decodeURIComponent(urle); var firstSeperator = (url.indexOf('?')==-1 ? '?' : '&'); var queryStringParts = new Array(); for(var key in redirectVars) { queryStringParts.push(key + '=' + encodeURIComponent(redirectVars[key])); } var queryString = queryStringParts.join('&'); result.redirect(url + firstSeperator + queryString); } result.send("400", "Bad request"); });
Usage of this service is as simple as,
/redirect?url=new-location
Any external app could use this service, which will append server controlled query string variables to the redirected URL. This is useful for a redirect service that needs to dynamically construct query string variables, such as cross-domain authentication and authorization.
Importantly, in order to preserve an existing query string in the new-location, simply encode the entire URL string before sending it into the service, e.g.,
var new_location = encodeURIComponent("http://foo.com/?q=test"); window.location = "http://www.yourapp.com/redirect?url=" + new_location;
Using the above node.js example, this would have the effect of redirecting the user to
http://foo.com/?q=test&foo=spam%20and%20eggs&tracker=42