2017-08-07 7 views
1

私のサーバにはwebsite1.comwebsite2.comという2つのドメインがあります。私は、次の書き換えルールをやろうとしているホストに依存するnginxリダイレクト

http://website1.com/   --> /website1/ (static) 
http://website2.com/   --> /website2/ (static) 

http://website1.com/app/  --> http://localhost:8080/web-app/web1/ 
http://website2.com/app/  --> http://localhost:8080/web-app/web2/ 

ユーザーは、nginxのか、URLに応じて、アプリケーション・サーバによって提供される静的なWebサイトにリダイレクトされます。

は、ここで私はこれまで試したものです:

location/{ 
     root html; 
     index index.html index.htm; 

     if ($http_host = website1.com) { 
      rewrite/ /website1/index.html break; 
      rewrite (.*) /website1/$1; 
     } 
     if ($http_host = website2.com) { 
      #same logic 
     } 
    } 

    location /app/ { 
     proxy_pass http://localhost:8080/web-app/; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     if ($http_host = website1.com) { 
     rewrite /app/(.*) /$1   break; 
     rewrite /app  /index.html; 
     } 
     if ($http_host = website2.com) { 
      #same logic 
     } 
    } 

静的な部分が正常に動作するようだが、リダイレクトWebアプリケーションの一部は、要求されたファイルが何であるかに関係なく、index.htmlを果たすようです。

+0

WEBSITE1とウェブサイト2は独立していないでくださいサーバーブロック? – MatTheWhale

+0

彼らは?これは今までのnginxとの最初のエンコーダーです。 –

+0

もしあなたがそうしたなら、それらの 'if($ http_host ==)'ブロックをすべて持つ必要はありません。彼らは問題の原因になる可能性があります – MatTheWhale

答えて

1

これはあまり確定的な答えではなく、むしろ私がどのようにnginxプロキシを動作させるかについての私の説明です。

root html; 
index index.html index.htm; 

server { 

    listen 80; 
    server_name website1.com; 
    location/{ 
     alias html/website1; 
    } 

    location /app/ { 
     proxy_pass http://localhost:8080/web-app/web1/ 
    } 
} 

server { 

    listen 80; 
    server_name website2.com; 
    location/{ 
     alias html/website2; 
    } 

    location /app/ { 
     proxy_pass http://localhost:8080/web-app/web2/ 
    } 
} 

問題は、それがこれらの書き換えによって引き起こされているように見えます:サーバserver_name sのブロックとaliasディレクティブを使用して

rewrite /app/(.*) /$1   break; 
rewrite /app  /index.html; 

は、我々は多くのロジックことを使用する必要を離れて行うことができます。まだ明確でないことがあれば教えてください。

+0

私は質問を投稿した後、私の要件が変わるので、これとは少し異なる解決策を見つけました。あなたの答えは正しい感謝のようです。 –

1

あなたは間違っていると思います。ホスト間に大きな違いがある場合は、ホストごとに1つずつ異なる2つの異なる構成を持つ方が、よりクリーンで効率的です。

一方、複数のほぼ同一の構成を使用する場合は、適切な方法はmapで、ifではありません。戻るあなたの構成に

- 私はちょうどそれがどのように動作するかを確認するために、それを実行してみた、とあなたは気づくことができる1つの事は、あなたがproxy_pass以内に指定したパスが効果的に内$host固有rewrite一度NOOPになることです同じコンテキストが$uriを変更することに関与しています - これは設計上のもので、http://nginx.org/r/proxy_pass"URIが書き換え指示文を使用してプロキシされた場所内で変更された場合")内に非常に明確に文書化されています。

ので、実際には、以下の構成を使用して、あなたの仕様に準拠するように見えるん:

%curl -H "Host: host1.example.com" "localhost:4935/app/" 
host1.example.com/web-app/web1/ 

%curl -H "Host: host2.example.com" "localhost:4935/app/" 
host2.example.com/web-app/web2/ 

%curl -H "Host: example.com" "localhost:4935/app/" 
example.com/web-app/ 

ここで私が使用した設定です:

server { 
    listen [::]:4935; 
    default_type text/plain; 
    location/{ 
     return 200 howdy; 
    } 
    location /app/ { 
     proxy_set_header Host $host; 
     proxy_pass http://localhost:4936/web-app/;#path is NOOP if $uri get changed 
     if ($host = host1.example.com) { 
      rewrite /app/(.*) /web-app/web1/$1   break; 
      rewrite /app  /web-app/index.html; 
     } 
     if ($host = host2.example.com) { 
      rewrite /app/(.*) /web-app/web2/$1   break; 
      rewrite /app  /web-app/index.html; 
     } 
    } 
} 

server { 
    listen [::]:4936; 
    return 200 $host$request_uri\n; 
} 
関連する問題