web-dev-qa-db-ja.com

Expressで完全なURLを取得する方法

私のサンプルURLは

http://example.com/one/two

そして私は私が次のルートを持っていると言う

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

urlの値は/one/twoになります。

Expressで full url を取得する方法を教えてください。例えば、上記の場合、私はhttp://example.com/one/twoを受け取りたいと思います。

399
Chris Abrams
  1. プロトコルはreq.protocolとして利用可能です。 ドキュメントはこちら

    1. Express 3.0より前のバージョンでは、req.get('X-Forwarded-Protocol')が設定されていてhttpという値を持っていない限り、httpsと見なすことができます。この場合、自分のプロトコルであることがわかります。
  2. Gopalが示しているように、ホストはreq.get('Host')から来ています。

  3. URLに標準以外のポートが必要ないことを願っていますが、それを知る必要がある場合は、サーバーの起動時にapp.listenに渡したものであるため、アプリケーション状態にしておく必要があります。ただし、標準以外のポートでのローカル開発の場合、ChromeはHostヘッダーにポートを含めるように思われるため、たとえばreq.get('Host')localhost:3000を返します。そのため、少なくとも標準ポート上の本番サイトで(リバースプロキシを使用せずに)エクスプレスアプリを直接参照する場合、HostヘッダーはURL内のポートに関して正しいことをするようです。

  4. パスはreq.originalUrlから来ています(ありがとう@pgrassant)。このDOESにはクエリ文字列が含まれています。 ここreq.urlとreq.originalUrlに関するドキュメント 。 URLで何をしようとしているかによって、originalUrlreq.urlと比較して正しい値である場合とそうでない場合があります。

これらすべてを組み合わせて絶対URLを再構築します。

  var fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl;
624
Peter Lyons

あなた自身でものを連結する代わりに、代わりに URLのnode.js APIを使用することができます そしてexpressからの情報をURL.format()に渡すことができます。

例:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl
  });
}
109
Michael Weibel

私はそれが要求されたURLを得るためにそれが少しPITAであることを見つけました。もっと簡単な表現方法がないとは思えない。ちょうどreq.requested_urlであるべきです

しかし、これを設定する方法は次のとおりです。

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

url.format を使用する

var url = require('url');

これはすべてのプロトコルをサポートし、ポート番号を含みます。 originalUrlにクエリ文字列がない場合は、次のようなより明確な解決策を使用できます。

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

クエリ文字列がある場合

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

これは、URLを取得するためにreqオブジェクトに対して呼び出すことができる関数を追加するための素晴らしい方法です。

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

必要に応じてオンデマンドで呼び出すことができる機能があります。

15

プロキシの背後にある表現 の場合、req.Host/req.hostnameを有効にするには2つの条件が必要です。

  1. app.jsのapp.set('trust proxy', 'loopback');
  2. X-Forwarded-HostヘッダはWebサーバであなた自身が指定しなければなりません。例えば。 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>
9
zhi.yang

これを使って、

var url = req.headers.Host + '/' + req.url;
8
Vaghani Janak
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;

または

var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
6
mlibre

URLではなくoriginalUrlを使用することをお勧めします。

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

ここでoriginalUrlの説明を参照してください: http://expressjs.com/api.html#req.originalUrl

私たちのシステムでは、このようなことをしているので、originalUrlは私たちにとって重要です。

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

blah_controllerは次のようになります。

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

そのため、私たちのURLは次のような形式になります。

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

したがって、バーコントローラのgetハンドラにreq.originalUrlが必要です。

6
Amber Haq Dixon

私のコードはこんな感じです

params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;

6
soomtong

あなたはそれをreq.headers.Host + req.urlを使って構築する必要があります。もちろん、あなたが別のポートでホストしていて、そのようなものであれば、アイデアを得ることができます;-)

6
g13n

ノードパッケージ 'url'を使用します(npm install url)

電話をかけたときに

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

uRLの全部または一部を取得する可能性があります。ここでより多くの情報: https://github.com/defunctzombie/node-url

/ in http://www.example.com/ の後に来るものすべてを変数として使用し、特定のプロファイルをプルアップするために次のように使用しました(一種のfacebook: http://www.facebook.com/username

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

これを機能させるには、server.jsファイルに次のように経路を作成する必要があります。

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

そして、このようにあなたのルートファイルを設定します。

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

以下のコードを使用することであなたのURLを取得できることを私は実際に発見しました。それからそれをスライスして次に何を決定するかに進んでください。

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });
1
Kennedy Nyaga

この情報をありがとうございました。これは信じられないほど面倒です。

これをあなたのコードに追加すれば、もう二度と考える必要がなくなります。

var app = express();

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

コンソールへのログ記録など、他のこともできます。

0
Nico