8

これはばかげているように思えますが、1時間以上の検索で有効な答えが見つかりませんでした.

nginx で実行されている静的な Web サイトがあります (Varnish の背後にあります)。インデックス ファイルの名前はindex.html. 実際に URL にアクセスした人を にリダイレクトしたいと考えていmydomain.com/index.htmlますmydomain.com

サイトのnginx構成は次のとおりです。

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.html301は期待どおりに場所とともに応答しますhttp://www.mydomain.com/が、残念ながらhttp://www.mydomain.com/それ自体にも 301 を返すため、リダイレクト ループが発生します。

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

4

2 に答える 2

10

ホームページを処理するための新しいロケーションブロックを追加し、( "index index.html;"の代わりに)try_filesディレクティブを使用してindex.htmlファイルを直接検索します。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 ]リダイレクトループの根本的な原因は「index」ディレクティブです。これにより、nginxはロケーションマッチの別のラウンドを再度実行します。このようにして、ロケーションブロックの外側の書き換えルールが再度実行され、ループが発生します。したがって、「index」ディレクティブは「rewrite...last;」のようなものです。指令。あなたはあなたの場合それを望まない。

秘訣は、別の場所の一致を再度トリガーしないことです。try_filesはそれを効率的に行うことができます。だから私は元の答えでそれを選びました。ただし、必要に応じて、別の簡単な修正方法を置き換えることもできます

  index index.html;

  rewrite ^/$ /index.html break;

元の「場所/」ブロック内。この'書き換え...ブレーク;' ディレクティブはnginxを同じロケーションブロック内にとどめ、ループを効果的に停止します。ただし、このアプローチの副作用は、「index」ディレクティブによって提供される機能が失われることです。

[更新2 ]

実際には、インデックスディレクティブはリライトディレクティブの後に実行されます。したがって、以下も機能します。rewrite...breakを追加したことに注意してください。ライン。リクエストのURIが「/」の場合、nginxは最初に書き換えルールから既存のファイル/index.htmlを検索します。したがって、この要求に対してインデックスディレクティブがトリガーされることはありません。その結果、両方のディレクティブが連携して機能します。

  location / {
    root   /usr/share/nginx/www.mydomain.com/public;
    index index.html;
    rewrite ^/$ /index.html break;
  }
于 2013-03-19T03:10:27.227 に答える
-1

アドレス バーに表示されたくないようですが、よろしいですか?index.php

nginx config に rewrite ディレクティブを追加すると、経験したようにリダイレクト ループが発生します。JavaScript ソリューションを受け入れる場合は、これを任意の場所に配置index.htmlして、アドレス バーを静かに書き換えることができます。

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

詳細については

最新のブラウザのほとんどはhistoryAPI をサポートしていますが、すべてがサポートしているわけではないことに注意してください (IE のほとんどのバージョン)。

于 2013-03-19T02:42:23.730 に答える