2017-10-27 8 views
0

私はローカルマシンのポート8080上で動作するサービスのリバースプロキシとしてnginxを使用しています。さらに、上流に送られたパスに/ vpを付加する必要があります。これは簡単で、私はそれのために働いてlocationブロックがありますので、上記のexample.com/resourceのようなURLをサポートしていますし、完璧に動作URLの書き換えに問題があります

location ~ ^/(.*?)$ { 
    proxy_pass $scheme://127.0.0.1:8080/vp/$1; 
    proxy_set_header Host $host; 
    proxy_redirect $scheme://$host/vp/ $scheme://$host/; 
} 

を。

ただし、example.com/vp/resourceのようなURLもサポートしたいと考えています。このために私は別のlocationブロックを書く必要があります。そうでなければ、それは動作しない/vp/vp/resourceとして上流に渡されます。

location ~ ^/vp/(.*?)$ { 
    rewrite /vp(.*?)$ /$1; 
} 

上記の作業と今、私はexample.com/vp/resourceのようなURLをサポートしています。

しかし、私は最後にもう一度修正したいことがあります。ユーザーがexample.com/vp/resourceにアクセスすると、ブラウザのURLをexample.com/resourceに書き換えることができます。私の上記の設定はこれを行わず、私はそれを変更する方法を知らない。私は書き換えのポイントはブラウザに見られるURLを書き換えることだと思ったが、それはそうではないようだ。これに

location ~ ^/vp/(.*?)$ { 
    rewrite /vp(.*?)$ /$1; 
} 

答えて

0

まず私は、これを変更しようとした

location ~ ^/vp/(.*?)$ { 
    return /$1; 
} 

をそして、これは主に働きました。/vpで始まるすべてのURIは、ブラウザのURLを変更しないURIにリダイレクトされます。しかし、これはPOST要求を機能させないという副作用がありました。これは、POST要求が実際に上流のサーバーに送信されることがないためです。代わりに、POSTはプロキシ・パスを使わずにすぐに301リダイレクトを返します。ブラウザはリダイレクト先を取得し、それが終了です。

したがって、私は、要求がPOSTではなく、それがproxy_passになったときにのみ、真の301を選択的に返す必要がありました。 If is Evilを読んだ後、iflocationの内部)にproxy_passを使用することはできません。returnrewriteしか使用できません。 rewriteを読んで、私はそれがリクエストのURIを書き換えてもすぐにそれをクライアントに返送しないことを学びました。代わりに、すべてのlocationブロックに対して新しく書き換えられたURIを実行し、一致するものを実行します。だから、私の場合は、元のlocationブロックを実行するのに、rewriteを使うだけでした。

location ~ ^/vp/(.*?)$ { 
    if ($request_method = POST) { 
     rewrite /vp(.*?)$ /$1; 
    } 

    if ($request_method != POST) { 
     return 301 /$1; 
    } 
} 

location ~ ^/(.*?)$ { 
    proxy_pass http://127.0.0.1:8080/vp/$1; 
    proxy_set_header Host $host; 
    proxy_redirect $scheme://$host/vp/ $scheme://$host/; 
} 

私の最終調整は、このように見てしまいました

関連する問題