2013-07-02 18 views
10

で最後のスラッシュ私はnginxの1.4.1のために以下の構成を使用しています:nginxのプロキシパス

 
server { 
    listen  8000; 
    server_name correct.name.gr; 

    location /test/register { 
     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_pass http://127.0.0.1; 
    } 
} 

私が何をしたいのかは、ユーザーがhttp://correct.name.gr:8000/test/register/をビストするとき、彼らは上で実行さapacheのにプロキシされなければならないですポート80.

http://correct.name.gr:8000/test/register/にアクセスすると、正しい結果(index.php)が得られます。 http://correct.name.gr:8000/test/register/asdにアクセスすると、正しい結果が得られます(Apacheから404)。 http://correct.name.gr:8000/test/asdにアクセスすると、正しい結果が得られます(nginxから404)。 http://correct.name.gr:8000/test/register123にアクセスすると、正しい結果が得られます(Apacheから404)。

問題は私がhttp://correct.name.gr:8000/test/registerにアクセスしたときです。私は301の応答を得て、私はhttp://localhost/test/register/にリダイレクトされています(末尾のスラッシュともちろん 'localhost'に注意してください)!

nginxには、末尾にスラッシュなどを付けるような設定はありません。あなたは何が問題なのか知っていますか?私はhttp://correct.name.gr:8000/test/registerがApacheにプロキシすることで正しく動作するようにしたい(または、少なくとも404エラーを出すことはできないが、ユーザのlocalhostへのリダイレクトはできない)。

アップデート1:私はちょうど正しいhttp://correct.name.gr:8000/test/register/に私を指摘し301応答を得た:私はまあ、それは働いていた..私は昨日の悪い行動を持っていたとものとは別のコンピュータからhttp://correct.name.gr:8000/test/registerを試してみました!あるコンピュータからはできますが、他のコンピュータからはできません(私は同じブラウザを使用していますが、両方のコンピュータでChromeを使用しています)。私は明日、もう一度試して3番目のテストから試して、その動作を見てみましょう。

ありがとうございました!

答えて

3

私の推測では、アップストリームサーバー(Apacheまたはスクリプトのいずれか)が絶対 URL http://localhost/test/register/へのリダイレクトをトリガーしたと思います。 をproxy_passディレクティブに使用しているため、nginxはドメイン名の一致を検出せず、Locationヘッダーをそのまま返します。

リダイレクトが内部URLの場合は、絶対リダイレクトを使用しないことをお勧めします。これは常に良い方法です。

ただし、アップストリームサーバーを変更することなく、2つの簡単な解決策があります。

ます。これは、上流のドメイン名がlocalhostでnginxの教えてくれます

proxy_pass http://localhost; 

を使用することができます。その後、nginxはhttp://localhosthttp://correct.name.gr:8000に置き換えることを知って、上流のLocationヘッダーのその部分を見つけたら、それを知ります。

もう1つはproxy_redirect行を追加して、nginxが任意の場所ヘッダーをhttp://localhost/で書き直すようにすることです。

proxy_pass http://127.0.0.1; 
proxy_redirect http://localhost/ /; 

私はより簡単なので、最初の解決策に優先します。 proxy_pass http://localhost;を使用するDNS検索のオーバーヘッドはありません。これは、nginxがWebサーバーを起動するときに事前にルックアップを実行するためです。

参照:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

1

すでにserver_name_in_redirectで試しましたか?

しかし、私はあなたの後ろにスラッシュと同じ問題を実行するため、Googleを介して質問が見つかりました。 Nginxは301に同じURLにを付け、の末尾にスラッシュを付けます。

+0

ありません、私はそれで遊んでみてくださいませんでした...私は明日になる - しかしPLS – Serafeim

+1

ちょうど任意のブラウザのキャッシュの副作用を回避するために、更新を見て、私はむしろ、これらのリダイレクトをテストすることをお勧めします"curl -IL http://correct.name.gr:8000/test/register" – vreen

+0

はい、非常に良いコメント...カールFTW! – Serafeim