1. ホーム
  2. nginx

[解決済み] NGINXのプロキシレスポンスでURLを書き換える方法

2022-11-30 20:36:05

質問

私は mod_proxy_html で Apache を使用しており、NGINX で同様のことを実現しようとしています。 具体的な使用例は、ルート コンテキストにあるサーバー上のポート 8080 で Tomcat で実行されている管理 UI があるということです。

http://localhost:8080/

私はポート80でこれを表示する必要がありますが、私はこのホスト上で実行されているNGINXサーバ上の他のコンテキストを持っているので、でこれを試してアクセスしたいと思います。

http://localhost:80/admin/

以下の超簡単なサーバーブロックでいけるかと思ったのですが、なかなかそうはいきません。

server {
    listen  80;
    server_name screenly.local.akana.com;

    location /admin/ {
        proxy_pass http://localhost:8080/;
    }
}

問題は、返されたコンテンツ (html) にスクリプトとスタイル情報への URL が含まれており、これらはすべてルートコンテキストでアクセスされるため、これらの URL を / の代わりに /admin/ で始まるように書き換える必要があることです。

NGINX でこれを行うにはどうすればよいですか。

どのように解決するのですか?

まず最初に のドキュメントを読んでください。 を注意深く、そして完全に読んでください。

上流サーバに渡される URI は、URI とともに "proxy_pass" ディレクティブが使用されているかどうかで決まります。proxy_passディレクティブの末尾にスラッシュがある場合は、URIが存在し、それが / . スラッシュがない場合は、URIがないことを意味します。

URIを含むProxy_pass :

location /some_dir/ {
    proxy_pass http://some_server/;
}

上記で、以下のようなプロキシがあります。

http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/          some_subdir/some_file

基本的には /some_dir/ に置き換えられます。 / からリクエストパスを変更するために /some_dir/some_subdir/some_file から /some_subdir/some_file .

URIのないProxy_pass :

location /some_dir/ {
    proxy_pass http://some_server;
}

2番目の(末尾のスラッシュがない)場合:プロキシはこのようになります。

http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file

基本的に、オリジナルのリクエストパスは変更されずにそのまま渡されます。


ですから、あなたの場合、望みのものを得るためには、末尾のスラッシュを削除すればよいようです。


注意事項

自動的な書き換えは、proxy_pass で変数を使用しない場合のみ機能することに注意してください。変数を使用する場合は、自分で書き換えを行う必要があります。

location /some_dir/ {
  rewrite    /some_dir/(.*) /$1 break;
  proxy_pass $upstream_server;
}

書き換えがうまくいかないケースは他にもあるので、ドキュメントを読むことは必須です。


編集

あなたの質問をもう一度読むと、あなたがhtml出力を編集したいだけだということを見逃していたかもしれないようです。

そのためには sub_filter ディレクティブを使います。次のようなものです。

location /admin/ {
    proxy_pass http://localhost:8080/;
    sub_filter "http://your_server/" "http://your_server/admin/";
    sub_filter_once off;
}

基本的には、置き換えたい文字列と置き換え文字列の