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