2016-10-15 11 views
1

私は2つの異なるドメインにリダイレクトするはずのnginxで定義された仮想ホストを持っています。 domain-x.comを使用するすべてのURLはdomain-a.comにリダイレクトされますが、domain-x.com/infoは正確にdomain-b.com/infoにリダイレクトされるはずです。私はこれを2つの異なる方法で試しました。特定の場所を別のドメインのその場所にリダイレクトする方法はありますか?

server { 
    listen 80; 
    server_name domain-x.com www.domain-x.com; 

    location ... 

    return 307 $scheme://domain-a.com$request_uri; 
} 

これはややdomain-x.com仕事から一般的なリダイレクトを行います

一般的に私のエントリは次のようになります。

location /info/ { 
    return 307 $scheme://domain-b.com/info; 
} 

と::私は二つの方法でリダイレクトを試してみましたlocationについて

location /info/ { 
    proxy_pass http://domain-b.com/; 
} 

を私も無駄にlocation = /info/でこれを試してみました。

私はに実行して問題がdomain-x.com/somethingのような任意のURLが[IP]somethingにリダイレクトされます(IPは、nginxのは、実行するサーバのアドレスである)、これはまた[IP]infoとして終わる/infoに適用されるということです。 [IP]/infoと入力すると、リダイレクトは期待通りに機能します。私の問題を整理するのを助けてくれますか?

答えて

1

基本的な問題は、同じレベルのブロックlocationをオーバーライドすると、serverブロックの裸の復帰がオーバーライドされることです。

デフォルトのreturnをデフォルトのlocationブロック内にラップして保護して、すべてのロケーションブロックが正しく評価されるようにします。たとえば、次のように

server { 
    listen 80; 
    server_name domain-x.com www.domain-x.com; 

    location/{ 
     return 307 $scheme://domain-a.com$request_uri; 
    } 
    location = /info { 
     return 307 $scheme://domain-b.com/info; 
    } 
} 

あるいは、これらのディレクティブは順番に評価されるようreturnの前でrewriteを使用しています。たとえば、

server { 
    listen 80; 
    server_name domain-x.com www.domain-x.com; 

    rewrite ^/info$ $scheme://domain-b.com/info redirect; 
    return 307 $scheme://domain-a.com$request_uri; 
} 

もちろん、2番目の例では、希望の307応答ではなく302応答を使用します。

どちらの例でも、私は/info URIの完全一致を前提としていましたが、どちらも接頭辞として/infoを受け入れるように簡単に修正されています。

詳細はthisおよびthisを参照してください。

+0

あなたのソリューションの両方を試してみましたが、私は同じ結果を得ました:今回は最後にスラッシュを入れた '[IP] info /'です。他のすべての仮想ホストを無効にしたにもかかわらず、他の設定が干渉しているのではないかと思っています。 – Midnighter

+0

ブラウザのプラグイン/ツールを試して、HTTPレスポンスの 'Location'ヘッダを分析し、どのサーバがドメイン名ではなくIPアドレスを返すのかを確認することをお勧めします。 –

+0

先に 'curl'を使用していたはずです...ターゲットサーバが問題を引き起こしている疑いがありました。 – Midnighter

関連する問題