1

同じドメインのサブパスでnginxプロキシのさまざまなアプリケーションを使用しようとしています。

私の問題は、アプリケーションによって生成されたリンク/がサブディレクトリではなくルートとして使用されることです。

私の構成は次のとおりです。

location /wiki/ {
    proxy_pass http://localhost:4567/;
    proxy_set_header SCRIPT_NAME /wiki;
}

proxy_set_header SCRIPT_NAME /wiki;アプリケーションがリンクを生成するために使用するヘッダーを設定する必要があると思いますSCRIPT_NAMEが、代わりHTTP_SCRIPT_NAMEに設定されており、アプリケーションによって無視されます。

SCRIPT_NAMEリンクが正しく生成されるように設定するにはどうすればよいですか?

4

1 に答える 1

2

CGI 仕様に従って、http ヘッダーは次のHTTP_プレフィックスで利用できます。

Meta-variables with names beginning with "HTTP_" contain values read
from the client request header fields, if the protocol used is HTTP.
The HTTP header field name is converted to upper case, has all
occurrences of "-" replaced with "_" and has "HTTP_" prepended to
give the meta-variable name.

つまり、ヘッダーはアプリケーションのSome-Headerように表示さHTTP_SOME_HEADERれます。つまり、すべてが機能することが期待されます-httpヘッダーを追加し、HTTP_プレフィックスで利用できるようにしました。

このSCRIPT_NAME変数は特別で、どのヘッダーによっても設定されませんが、代わりに、アプリケーションを実行するコードによって URI から構築されます。それを変更するには、実際にバックエンドから見える URI を変更する必要があります。

proxy_pass http://localhost:4567/wiki/;

または/wiki/、proxy_pass にある限り、 nolocation /wiki/です。つまり、

location /wiki/ {
    proxy http://localhost:4567;
}

ここでの悪い点は、何らかの理由でURI を から/wiki/に変更した可能性があることです。つまり、バックエンド アプリケーションが を期待しています。この問題にはいくつかの解決策があります。//

  1. 実際にアプリケーションを に移動します/wiki/。通常、これを行うのは簡単です。
  2. アプリを変更して、帯域外の方法でリンクなどを生成するために使用されるベース URL を受け入れるようにします。多くのアプリケーションは、いくつかの構成オプションを介してすでにこれをサポートしています。
  3. アプリケーションが返すものを nginx 自体で置き換えてみてください。これを行う nginx ディレクティブがいくつかあります。具体的には、 proxy_redirect 、 proxy_cookie_pathおよびsub filterです。ただし、これは最も壊れやすい方法であり、アプリケーションが何を返し、何を正確に置き換える必要があるかを理解していない限り、お勧めできません。
于 2012-11-11T13:33:58.137 に答える