2013-03-19 18 views
5

これはばかばかしいようですが、私は1時間以上の検索で実際の答えが見つかりませんでした。nginx静的インデックスリダイレクト

私は、静的なウェブサイトをnginxから実行しています(これは、ワニスの後ろにあることがあります)。インデックスファイルはindex.htmlです。私は実際にURL mydomain.com/index.htmlを訪問した人をmydomain.comにリダイレクトしたいと思います。場所http://www.mydomain.com/301と予想されるが、残念ながらhttp://www.mydomain.com/もバック自体に301を提供していますので、我々はリダイレクトループを得るよう

server { 
    listen 8080; 
    server_name www.mydomain.com; 
    port_in_redirect off; 

    location/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    index index.html; 
    } 

    rewrite /index.html http://www.mydomain.com/ permanent; 
} 

http://www.mydomain.com/index.html応答:

はここにサイトのための私のnginxの設定です。

index.htmlが文字通りリクエストに含まれている場合、nginxに301のサービスしか提供しないようにするにはどうすればよいですか?

答えて

7

ホームページを扱う新しい場所ブロックを追加し、index.htmlファイルを直接探すために( "index index.html;"ではなく)try_filesディレクティブを使用してください。 try_filesでは少なくとも2つの選択肢を入力する必要があります。だから私は同じファイルを2回置く。

location =/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    try_files /index.html /index.html; 
} 

は私の実験に基づいた優れたルックス:

curl -iL http://www.mydomain.com/index.html 
HTTP/1.1 301 Moved Permanently 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 178 
Connection: keep-alive 
Location: http://www.mydomain.com/ 

HTTP/1.1 200 OK 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 4 
Last-Modified: Sat, 16 Mar 2013 08:05:47 GMT 
Connection: keep-alive 
Accept-Ranges: bytes 

[UPDATE] リダイレクトループの根本的な原因は、場所の別のラウンドを行うためにnginxのトリガー「インデックス」ディレクティブであり、再び一致します。これで、ロケーションブロックの外側の書き換えルールが再度実行され、ループが発生します。したがって、 'index'ディレクティブは "書き直し...最後のような"指令。あなたはあなたの場合にそれを望んでいません。

トリックはもう一度別の場所の一致をトリガーしないことです。 try_filesはそれを効率的に行うことができます。だから私は元の答えでそれを選んだのです。あなたが好きな場合は、別の簡単な修正は、元の "場所/" ブロック内

rewrite ^/$ /index.html break; 

によって

index index.html; 

を交換することです。これは '書き換え...休憩'ディレクティブはnginxを同じ場所ブロック内にとどめ、効果的にループを止めます。しかし、このアプローチの副作用は、 'index'ディレクティブによって提供される機能を失うことです。

[UPDATE 2]

は実際には、インデックスディレクティブは書換指令の後に実行されます。それで、以下も働きます。私はちょうど書き直し...ブレークを追加したことに注意してください。ライン。リクエストuriが "/"の場合、nginxは既存のファイル/index.htmlを最初に書き換えルールから探します。そのため、この要求に対してインデックス・ディレクティブがトリガーされることはありません。結果として、両方のディレクティブが同時に動作することができます。

location/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    index index.html; 
    rewrite ^/$ /index.html break; 
    } 
+0

ありがとう、それは動作します。なぜ私はリダイレクトループを止めるのか分かりませんが、それはありません。 'try_files'はちょっと魔法です。 'try_files /index.html/index.html;'行を_existing_位置ブロックに置くのがなぜ機能しないのか説明できますか? (私はそれを試みた)。乾杯。 – Ade

+0

@ chuan-maがあなたの問題を解決したので、受け入れられたとして答えを記入することを忘れないでください:) –

+0

@Ade私は今夜後で説明します。 –

-1

のように見えます。のアドレスバーにはindex.phpが表示されません。

nginx configにリライトディレクティブを追加すると、経験したようにリダイレクトループが発生します。最新のブラウザはhistory APIをサポートしながら、ことを覚えていないしてください

<script> 
    history.pushState(null, '', '/'); 
</script> 

For more information

:あなたはjavascriptのソリューションに開かれている場合、あなたは黙ってアドレスバーを書き換えるためにあなたのindex.htmlでこのどこにでも配置することができすべてのこと(つまり、IEのほとんどのバージョン)。

+0

ありがとうございます;はい、リダイレクトを行うためのアプリケーションレベルのいくつかの方法については知っていますが、これはサーバーレベルで構成するために、数多くのアプリケーションで再利用される予定です。 – Ade

関連する問題