私のサンプルURLが
そして、私は次のルートを持っていると言います
app.get('/one/two', function (req, res) {
var url = req.url;
}
の値はurl
になります/one/two
。
Expressで完全な URLを取得するにはどうすればよいですか? 例えば上記の場合、 を受け取りたいhttp://example.com/one/two
です。
私のサンプルURLが
そして、私は次のルートを持っていると言います
app.get('/one/two', function (req, res) {
var url = req.url;
}
の値はurl
になります/one/two
。
Expressで完全な URLを取得するにはどうすればよいですか? 例えば上記の場合、 を受け取りたいhttp://example.com/one/two
です。
プロトコルは として入手できますreq.protocol
。ドキュメントはこちら
http
除き、プロトコルであると想定できます。req.get('X-Forwarded-Protocol')
https
req.get('host')
Gopalが示したように、ホストは由来します
URL に非標準のポートが必要ないことを願っていますが、それを知る必要がある場合はapp.listen
、サーバーの起動時に渡したものであるため、アプリケーションの状態にあるはずです。ただし、非標準ポートでのローカル開発の場合、Chrome はホスト ヘッダーにポートを含めるようで、たとえば をreq.get('host')
返します。localhost:3000
したがって、少なくとも標準ポート上の本番サイトの場合、(リバース プロキシを使用せずに) Express アプリを直接参照する場合、host
ヘッダーは URL のポートに関して正しいことを行うようです。
パスはreq.originalUrl
(@pgrassantに感謝)から来ています。これにはクエリ文字列が含まれていることに注意してください。docs here on req.url および req.originalUrl。URL で何をしようとしているかによって、 はoriginalUrl
と比較して正しい値である場合とそうでない場合がありますreq.url
。
これらをすべて組み合わせて、絶対 URL を再構築します。
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
要求された 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;
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);
req.host/req.hostname を有効にするには、プロキシの背後で Express を使用する場合に 2 つの条件が必要です。
app.set('trust proxy', 'loopback');
app.js でX-Forwarded-Host
ヘッダーは、Web サーバーで所有している必要があります。例えば。アパッチ、nginxnginx :
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>
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
関数では、すべてのルートで同じ結果が得られるため、プロパティは常に固定されています。
プロパティ
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
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 が必要です。
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;
また
var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;
を使用して構築する必要がありますreq.headers.host + req.url
。もちろん、別のポートでホストしている場合などは、アイデアが得られます;-)
私のコードは次のようになります。
params['host_url'] = req.protocol + '://' + req.headers.host + req.url;
async function (request, response, next) {
const url = request.rawHeaders[9] + request.originalUrl;
//or
const url = request.headers.host + request.originalUrl;
}
req.protocol
、req.hostname
、およびを組み合わせることができますreq.originalUrl
。orreq.hostname
ではなく、動作するが読みにくいことに注意してください。req.host
req.get("host")
const completeUrl = `${req.protocol}://${req.hostname}${req.originalUrl}`;
.env ファイルが .gitignore によって無視される場所に置くだけで、.env
サーバー環境ごとに、そのサーバーのホスト文字列を含む異なる .env を持つことになります
.env コード
HOSTNAME=example.com
ホットネームが必要なファイル。
const dotenv = require("dotenv");
dotenv.config();
console.log('hostname: '+process.env.HOSTNAME)
出力:
hostname: example.com
const fullUrl = `${protocol}://${host}:${port}${url}`
const responseString = `Full URL is: ${fullUrl}`;
res.send(responseString);
})