605

私のサンプルURLが

http://example.com/one/two

そして、私は次のルートを持っていると言います

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

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

Expressで完全な URLを取得するにはどうすればよいですか? 例えば上記の場合、 を受け取りたいhttp://example.com/one/twoです。

4

22 に答える 22

892
  1. プロトコルは として入手できますreq.protocolドキュメントはこちら

    1. Express 3.0 より前では、それが設定されていて、値が であることがわかっている場合をhttp除き、プロトコルであると想定できます。req.get('X-Forwarded-Protocol')https
  2. req.get('host')Gopalが示したように、ホストは由来します

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

  4. パスはreq.originalUrl(@pgrassantに感謝)から来ています。これにはクエリ文字列が含まれていることに注意してください。docs here on req.url および req.originalUrl。URL で何をしようとしているかによって、 はoriginalUrlと比較して正しい値である場合とそうでない場合がありますreq.url

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

  var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
于 2012-04-17T05:12:03.537 に答える
41

要求された URL を取得するのはちょっと面倒だと思いました。表現するのにもっと簡単な方法がないとは信じられません。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;
于 2012-10-21T08:06:26.877 に答える
18

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);
于 2015-08-02T07:24:42.457 に答える
13

req.host/req.hostname を有効にするには、プロキシの背後で Express を使用する場合に 2 つの条件が必要です。

  1. app.set('trust proxy', 'loopback');app.js で
  2. X-Forwarded-Hostヘッダーは、Web サーバーで所有している必要があります。例えば。アパッチ、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;
    }
}

アパッチ:

<VirtualHost myhost:80>
    ServerName myhost
    DocumentRoot /path/to/myapp/public
    ProxyPass / http://myapp:8080/
    ProxyPassReverse / http://myapp:8080/
</VirtualHost>
于 2016-06-15T01:58:16.570 に答える
12

2021年

上記の回答は正常に機能していますが、ドキュメントでは推奨されていません。これurl.parseは、より詳細に制御したい場合は functionlegacyを使用することをお勧めします。new URL()url

高速道路

Full URL以下のコードから取得できます。

`${req.protocol}://${req.get('host')}${req.originalUrl}`

URL の例: http://localhost:5000/a/b/c?d=true&e=true#f=false

固定プロパティ(すべてのルートで同じ結果が得られます)

req.protocol: http
req.hostname: localhost
req.get('Host'): localhost:5000
req.originalUrl: /a/b/c?d=true&e=true
req.query: { d: 'true', e: 'true' }

固定されていないプロパティ(エクスプレス自体によって制御されるため、すべてのルートで変更されます)

ルート:/

req.baseUrl: <blank>
req.url: /a/b/c?d=true&e=true
req.path: /a/b/c

ルート/a

req.baseUrl: /a
req.url: /b/c?d=true&e=true
req.path: /b/c

ドキュメント: http://expressjs.com/en/api.html#req.baseUrl

URL パッケージの方法

このURL関数では、すべてのルートで同じ結果が得られるため、プロパティは常に固定されています。

プロパティ

ここに画像の説明を入力

const url = new URL(`${req.protocol}://${req.get('host')}${req.originalUrl}`);
console.log(url)

以下のような結果が得られます。イメージ フローに一致するように、イメージに従ってプロパティの順序を変更しました。

URL {
  href: 'http://localhost:5000/a/b/c?d=true&e=true',
  protocol: 'http:',
  username: '',
  password: '',
  hostname: 'localhost',
  port: '5000',
  host: 'localhost:5000',
  origin: 'http://localhost:5000',
  pathname: '/a/b/c',
  search: '?d=true&e=true',
  searchParams: URLSearchParams { 'd' => 'true', 'e' => 'true' },
  hash: ''
}

Hashサーバーと同じように処理するため、サーバーに送信できませんがFragment、クライアント側の平均ブラウザで取得します。

ドキュメント: https://nodejs.org/api/url.html#url_new_url_input_base

于 2021-07-14T05:34:26.253 に答える
8

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 が必要です。

于 2014-02-18T19:30:41.200 に答える
8
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

また

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;
于 2017-01-18T10:08:16.070 に答える
7

を使用して構築する必要がありますreq.headers.host + req.url。もちろん、別のポートでホストしている場合などは、アイデアが得られます;-)

于 2012-04-17T00:08:00.520 に答える
6

私のコードは次のようになります。

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

于 2013-06-12T08:02:24.690 に答える
1
async function (request, response, next) {
  const url = request.rawHeaders[9] + request.originalUrl;
  //or
  const url = request.headers.host + request.originalUrl;
}
于 2020-12-28T06:05:18.840 に答える
0

req.protocolreq.hostname、およびを組み合わせることができますreq.originalUrl。orreq.hostnameではなく、動作するが読みにくいことに注意してください。req.hostreq.get("host")

const completeUrl = `${req.protocol}://${req.hostname}${req.originalUrl}`;
于 2021-11-22T22:32:06.213 に答える
-2

.env ファイルが .gitignore によって無視される場所に置くだけで、.envサーバー環境ごとに、そのサーバーのホスト文字列を含む異なる .env を持つことになります

.env コード

HOSTNAME=example.com

ホットネームが必要なファイル。

const dotenv = require("dotenv");
dotenv.config();

console.log('hostname: '+process.env.HOSTNAME)

出力:

hostname: example.com
于 2021-12-07T07:36:27.970 に答える
-3
const fullUrl = `${protocol}://${host}:${port}${url}`
      
    const responseString = `Full URL is: ${fullUrl}`;                       
    res.send(responseString);  
})
于 2021-11-10T14:13:04.400 に答える