私のサンプル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
(thanks @pgrassant)から来ています。これにはクエリ文字列が含まれることに注意してください。req.urlとreq.originalUrlに関するドキュメント。URLをどのように処理するかによってoriginalUrl
、と比較して正しい値になる場合とそうでない場合がありますreq.url
。
これらをすべて組み合わせて、絶対URLを再構築します。
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
req.get('Host')
代わりに使用してreq.host
、ホストとポートセクションを提供します。
host
リクエストヘッダーのパラメータは偽装できます。res.host
この方法を使用すると、「ホストヘッダー攻撃」の可能性があります。Djangoフレームワークでは、そのような攻撃を防ぐために使用される「許可されたホスト」変数があります。私は、完了root_url
のreq.url
ためにに追加できるmy である構成変数を使用しています。:攻撃についてskeletonscribe.net/2013/05/...
req.originalUrl
パラメータなしで追加したい場合は、単に実行してくださいreq.originalUrl.split("?").shift()
。出典:stackoverflow.com/a/32118818/2037431
自分で連結する代わりに、URLにnode.js APIを使用して、URL.format()
expressから情報を渡すことができます。
例:
var url = require('url');
function fullUrl(req) {
return url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl
});
}
req.get('host')
はポートではなくホスト名の部分のみを返します。理由はわかりませんが、設定からポート番号を収集しhostname
、ではなくフィールドを使用していますhost
。
pathname
、私はあなたが意味すると思いますpath
。どの検索/クエリ文字列が含まれる
要求された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;
req.port
存在?それはExpressのドキュメントにありませんか?
req.app.settings.port
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');
app.jsX-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>
127.0.0.1
からreq.get('host')
これを使って、
var url = req.headers.host + '/' + req.url;
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が必要です。
ノードパッケージ「url」を使用します(npm install url)
それはあなたが電話したときです
url.parse(req.url, true, true)
URLのすべてまたは一部を取得する可能性があります。詳細はこちら:https : //github.com/defunctzombie/node-url
次のように使用して、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
}
このようなルートでこの機能を使うことができます
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
httpまたはhttps
を提供し、req.headers.host
www.google.comのような完全なホスト名
req.originalUrl
を提供し、残りpathName
(あなたの場合/one/two
)を提供します