2016-03-29 5 views
-1

私はhttp://foo.tld/bar/baz/proxy_passを使用して提供されるサーバーhttp://255.255.255.255:8888/上で実行されているHTTPサービスがあります。proxy_passの後ろにある現在のURLを取得するには?

server { 
    server_name foo.tld; 

    location /bar/baz/ { 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $remote_addr; 

     proxy_pass http://255.255.255.255:8888/; 
    } 
} 

今私はhttp://foo.tld/bar/baz/を取得するためのGETリクエストを作っています:

curl http://foo.tld/bar/baz/ 

で実行されているHTTPサービスを8888ポートは単純なExpressアプリです。

app.get('/', (req) => { 
    console.log('req.url', req.url); 
    console.log('req.originalUrl', req.originalUrl); 
}); 

リクエストされているURLのURL(または少なくとも絶対パス)を取得したいとします。ただし、上記コードreq.urlreq.originalUrlは、/bar/baz/ではなく、/となります。

サービスの実際の絶対パスを取得するにはどうすればよいですか?

+0

あなたの場所は/ bar/bazに設定されているので、foo.tldのサービスはこのディレクトリのレベルで実行されています。 –

答えて

0

アプリに信頼されたプロキシを追加

X-Forwarded-Host 

ホストに次のように設定し、プロキシヘッダでproxy_pass http://255.255.255.255:8888/;proxy_pass http://255.255.255.255:8888;

0

を変更してみてください:

app.set('trust proxy', 'your internal IP'); 

そして、これを使用しますURLを取得する

req.originalUrl; 
+0

ホストは正しいです。間違ったパスです。 – Gajus

+0

改善された提案に対する回答を更新しました。 – Arbel

+0

答えはまだパスとは対照的にホストについて話しています。 – Gajus

0

まず、@ evan-lucasの回答(https://stackoverflow.com/a/36290054/368691)を元の質問にしてください。 documentationを引用する:

proxy_passはURI、元 要求が処理されたときにクライアントから送信されたとURIが同じ形式でサーバーを に渡される要求、または完全な正規化された要求せずに指定された場合変更されたURIを処理するときにURIが を渡されます。

このアプローチの問題は、それがベースURL(/bar/bazを)知っているアプリを必要とすることです。これを行う1つの方法は、カスタムヘッダーを介して渡すことです。質問に答えました。

しかし、記録のために、ロールバックをすることができますし、元の問題(私はXY problemのため申し訳ありません)を理解する:

を私の元の問題は、私のアプリはすなわち、アプリケーションのベースパスにリダイレクトしようとしたことだった

この設定で
app.get('/test', (res) => { 
    res.redirect('/'); 
}); 

、私は//foo.tld/bar/baz/にリダイレクトするためにGETリクエスト//foo.tld/bar/baz/testを期待していました。しかし、HTTPサービスはリバースプロキシの背後にホストされているため、上記の結果はユーザが//foo.tld/にリダイレクトされることです。私は、アプリの絶対URLが何であるかを調べ、ユーザーをそのURLにリダイレクトして、つまり/bar/baz/に問題を解決しようとしました。

@ evan-lucasの解決策では、アプリにベースURLを認識させる必要があります。したがって、Locationヘッダーを書き換える方法を検討しました。 nginxがその指示文を提供していることがわかります:proxy_redirect

は今、私が行うことができます。

location /bar/baz/ { 
    proxy_pass http://255.255.255.255:8888/; 
    proxy_redirect ~/(.*)$ /bar/baz/$1; 

    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $remote_addr; 
} 

を今なLocation: /quuxなどLocationヘッダは/bar/baz/quuxに書き換えられ、アプリ自体は、実際のURLを意識する必要はありません。

関連する問題