web-dev-qa-db-ja.com

nginxリバースプロキシで相対URLを正しく処理する方法

確かに私はexample.comからドメインexample.net/bbbを提供しようとした最初の人物ではありませんが、まだ解決策を見つけていません。

私のNGINX構成は guidelines に従い、次のようになります。

server {
    listen 80;
    server_name example.net;
    root /path/to/aaa;

    location /bbb/ {
        proxy_pass http://example.com/;
        proxy_set_header Host $Host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
    location ~ \.(svg|ttf|js|css|svgz|eot|otf|woff|jpg|jpeg|gif|png|ico)$ {
        access_log off;
        log_not_found off;
        expires max;
    }
}

example.comexample.net/bbbのルートをなんとかレンダリングできますが、

第1号

example.net/bbb/some/pathは期待どおりに動作せず、index.htmlexample.netがレンダリングされます。

第2号

ブラウザがexample.com/assetsを探すため、example.net/assetsのアセットは404になります。絶対パスをどこにも配置せずにこれを解決できたら素晴らしいことです。

11
a.barbieri

問題は基本的に、proxy_passディレクティブを使用してもHTMLコードが書き換えられないため、たとえばimg src="/assets/image.png"への相対URLがimg src="/bbb/assets/image.png"に魔法のように変更されないことです。

Apache httpd here でそれに対処するための潜在的な戦略について書きましたが、nginxでも同様のソリューションが可能です。

  • example.comおよびアプリケーション/コンテンツのデプロイ方法を制御できる場合、同じベースURIにデプロイリバースプロキシのexample.netで使用する
    -> example.com/bbbにコードをデプロイすると、/ assets/image.pngが/bbb/assets/image.pngに移動されるため、proxy_passは非常に簡単になります:

    location /bbb/ {
         proxy_pass http://example.com/bbb/; 
    
  • example.comおよびアプリケーション/コンテンツのデプロイ方法を制御できる場合:
    相対パスに変更、つまりimg src="/assets/image.png"ではなく
    ページからimg src="./assets/image.png"を参照example.com/index.html
    およびimg src="../../assets/image.png"ページへexample.com/some/path/index.html

  • 多分あなたは幸運で、example.comはルートのいくつかのURIパスのみを使用し、それらのどれもexample.netで使用されない場合、単純に必要なすべてのサブディレクトリのリバースプロキシ

    location /bbb/ {
         proxy_pass http://example.com/; 
    }
    location /assets/ {
         proxy_pass http://example.com/assets/; 
    }
    location /styles/ {
         proxy_pass http://example.com/styles/; 
    
  • example.comをexample.netのサブディレクトリとして使用することをあきらめ、代わりにexample.netのサブドメインでホストします。

    server { 
      server_name bbb.example.net 
      location / {
         proxy_pass http://example.com/; 
      }
    }
    
  • (HTML)コンテンツを書き換え nginxを有効にして ngx_http_sub_module 。また、絶対URLを次のようなものに書き換えることもできます。

    location /bbb/ {
         sub_filter 'src="/assets/'  'src="/bbb/assets/';
         sub_filter 'src="http://example.com/js/' 'src="http://www.example.net/bbb/js/' ;
         sub_filter_once off;
         proxy_pass http://example.com/; 
    }
    
20
HBruijn