# node.js – How to get the full url in Express?

## The Question :

530 people think this question is useful

Let’s say my sample url is

http://example.com/one/two

and I say I have the following route

app.get('/one/two', function (req, res) {
var url = req.url;
}



The value of url will be /one/two.

How do I get the full url in Express? For example, in the case above, I would like to receive http://example.com/one/two.

• FYI you can inspect the request object and look through but I am a hypocrite and found it on here.

800 people think this answer is useful
1. The protocol is available as req.protocol. docs here

1. Before express 3.0, the protocol you can assume to be http unless you see that req.get('X-Forwarded-Protocol') is set and has the value https, in which case you know that’s your protocol
2. The host comes from req.get('host') as Gopal has indicated

3. Hopefully you don’t need a non-standard port in your URLs, but if you did need to know it you’d have it in your application state because it’s whatever you passed to app.listen at server startup time. However, in the case of local development on a non-standard port, Chrome seems to include the port in the host header so req.get('host') returns localhost:3000, for example. So at least for the cases of a production site on a standard port and browsing directly to your express app (without reverse proxy), the host header seems to do the right thing regarding the port in the URL.

4. The path comes from req.originalUrl (thanks @pgrassant). Note this DOES include the query string. docs here on req.url and req.originalUrl. Depending on what you intend to do with the URL, originalUrl may or may not be the correct value as compared to req.url.

Combine those all together to reconstruct the absolute URL.

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;



141 people think this answer is useful

Instead of concatenating the things together on your own, you could instead use the node.js API for URLs and pass URL.format() the informations from express.

Example:

var url = require('url');

function fullUrl(req) {
return url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl
});
}



40 people think this answer is useful

I found it a bit of a PITA to get the requested url. I can’t believe there’s not an easier way in express. Should just be req.requested_url

But here’s how I set it:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;



18 people think this answer is useful

Here is a great way to add a function you can call on the req object to get the url

  app.use(function(req, res, next) {
req.getUrl = function() {
return req.protocol + "://" + req.get('host') + req.originalUrl;
}
return next();
});



Now you have a function you can call on demand if you need it.

18 people think this answer is useful

Using url.format:

var url = require('url');



This support all protocols and include port number. If you don’t have a query string in your originalUrl you can use this cleaner solution:

var requrl = url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl,
});



If you have a query string:

var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.host = req.get('host');
var requrl = url.format(urlobj);



12 people think this answer is useful

make req.host/req.hostname effective must have two condition when Express behind proxies:

1. app.set('trust proxy', 'loopback'); in app.js
2. X-Forwarded-Host header must specified by you own in webserver. eg. apache, nginx

nginx:

server {
listen myhost:80;
server_name  myhost;
location / {
root /path/to/myapp/public;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_pass http://myapp:8080;
}
}



apache:

<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>



11 people think this answer is useful

Use this,

var url = req.headers.host + '/' + req.url;



8 people think this answer is useful
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;



or

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;



7 people think this answer is useful

I would suggest using originalUrl instead of URL:

var url = req.protocol + '://' + req.get('host') + req.originalUrl;



See the description of originalUrl here: http://expressjs.com/api.html#req.originalUrl

In our system, we do something like this, so originalUrl is important to us:

  foo = express();
express().use('/foo', foo);
foo.use(require('/foo/blah_controller'));



blah_controller looks like this:

  controller = express();
module.exports = controller;
controller.get('/bar/:barparam', function(req, res) { /* handler code */ });



So our URLs have the format:

www.example.com/foo/bar/:barparam



Hence, we need req.originalUrl in the bar controller get handler.

6 people think this answer is useful

You need to construct it using req.headers.host + req.url. Of course if you are hosting in a different port and such you get the idea 😉

6 people think this answer is useful

My code looks like this,

params['host_url'] = req.protocol + '://' + req.headers.host + req.url;

5 people think this answer is useful

I use the node package ‘url’ (npm install url)

What it does is when you call

url.parse(req.url, true, true)



it will give you the possibility to retrieve all or parts of the url. More info here: https://github.com/defunctzombie/node-url

I used it in the following way to get whatever comes after the / in http://www.example.com/ to use as a variable and pull up a particular profile (kind of like facebook: http://www.facebook.com/username)

    var url = require('url');
var urlParts = url.parse(req.url, true, true);
var pathname = urlParts.pathname;



Though for this to work, you have to create your route this way in your server.js file:

self.routes['/:username'] = require('./routes/users');



And set your route file this way:

router.get('/:username', function(req, res) {
//here comes the url parsing code
}



5 people think this answer is useful

Just the code below was enough for me!

const baseUrl = ${request.protocol}://${request.headers.host};
// http://127.0.0.1:3333



4 people think this answer is useful

You can use this function in the route like this

app.get('/one/two', function (req, res) {
const url = getFullUrl(req);
}

/**
* Gets the self full URL from the request
*
* @param {object} req Request
* @returns {string} URL
*/
const getFullUrl = (req) => ${req.protocol}://${req.headers.host}\${req.originalUrl};



req.protocol will give you http or https, req.headers.host will give you the full host name like www.google.com, req.originalUrl will give the rest pathName(in your case /one/two)

1 people think this answer is useful

Thank you all for this information. This is incredibly annoying.

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
req.fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
next()
})



You can do or set other things there as well, such as log to console.

async function (request, response, next) {