私のサンプルURLは
そして私は私が次のルートを持っていると言う
app.get('/one/two', function (req, res) {
var url = req.url;
}
url
の値は/one/two
になります。
Expressで full url を取得する方法を教えてください。例えば、上記の場合、私はhttp://example.com/one/two
を受け取りたいと思います。
プロトコルはreq.protocol
として利用可能です。 ドキュメントはこちら
req.get('X-Forwarded-Protocol')
が設定されていてhttp
という値を持っていない限り、https
と見なすことができます。この場合、自分のプロトコルであることがわかります。Gopalが示しているように、ホストはreq.get('Host')
から来ています。
URLに標準以外のポートが必要ないことを願っていますが、それを知る必要がある場合は、サーバーの起動時にapp.listen
に渡したものであるため、アプリケーション状態にしておく必要があります。ただし、標準以外のポートでのローカル開発の場合、ChromeはHostヘッダーにポートを含めるように思われるため、たとえばreq.get('Host')
はlocalhost:3000
を返します。そのため、少なくとも標準ポート上の本番サイトで(リバースプロキシを使用せずに)エクスプレスアプリを直接参照する場合、Host
ヘッダーはURL内のポートに関して正しいことをするようです。
パスはreq.originalUrl
から来ています(ありがとう@pgrassant)。このDOESにはクエリ文字列が含まれています。 ここreq.urlとreq.originalUrlに関するドキュメント 。 URLで何をしようとしているかによって、originalUrl
はreq.url
と比較して正しい値である場合とそうでない場合があります。
これらすべてを組み合わせて絶対URLを再構築します。
var fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl;
あなた自身でものを連結する代わりに、代わりに 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
});
}
私はそれが要求された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;
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);
これは、URLを取得するためにreqオブジェクトに対して呼び出すことができる関数を追加するための素晴らしい方法です。
app.use(function(req, res, next) {
req.getUrl = function() {
return req.protocol + "://" + req.get('Host') + req.originalUrl;
}
return next();
});
必要に応じてオンデマンドで呼び出すことができる機能があります。
プロキシの背後にある表現 の場合、req.Host/req.hostnameを有効にするには2つの条件が必要です。
app.set('trust proxy', 'loopback');
X-Forwarded-Host
ヘッダはWebサーバであなた自身が指定しなければなりません。例えば。 Apache、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;
}
}
Apache :
<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>
これを使って、
var url = req.headers.Host + '/' + req.url;
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;
または
var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
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が必要です。
私のコードはこんな感じです
params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;
あなたはそれをreq.headers.Host + req.url
を使って構築する必要があります。もちろん、あなたが別のポートでホストしていて、そのようなものであれば、アイデアを得ることができます;-)
ノードパッケージ '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
}
以下のコードを使用することであなたのURLを取得できることを私は実際に発見しました。それからそれをスライスして次に何を決定するかに進んでください。
app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
});
この情報をありがとうございました。これは信じられないほど面倒です。
これをあなたのコードに追加すれば、もう二度と考える必要がなくなります。
var app = express();
app.all("*", function (req, res, next) { // runs on ALL requests
req.fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl
next()
})
コンソールへのログ記録など、他のこともできます。