web-dev-qa-db-ja.com

Nginxでindex.htmlをルートファイルとして設定するにはどうすればよいですか?

ドメイン名にindex.htmlを設定する方法 https://www.example.com/ -ユーザーをルートディレクトリのindex.htmlに導きます。

私は次のようなさまざまなことを試しました:

server {
    # some configs

    location = / {
            index index.html;
            fastcgi_index index.html;
    }
or 
    location / {
            index index.html;
            fastcgi_index index.html;
    }

}

何も私を助けませんでした。

Locationキーワードを使用した他の設定もいくつかありますが、私もコメントしました。

server {句の他の「場所」設定:

location ~ .*(css|htc|js|bmp|jp?g|gif|ico|cur|png|swf|htm?|html)$ {
        access_log off;
        root $www_root;
}

location ~ \.php$
{
        include                         /etc/nginx/fastcgi_params;
        index                           index.html;
        fastcgi_index                   index.html;
        fastcgi_param SCRIPT_FILENAME   $www_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING      $query_string;
        fastcgi_param PATH_INFO         $fastcgi_path_info;
        fastcgi_pass                    127.0.0.1:9000;
        # Директива определяет что ответы FastCGI-сервера с кодом больше или равные 400
        # перенаправлять на обработку nginx'у с помощью директивы error_page
        fastcgi_intercept_errors        on;
        break;
}

location ~ /\.ht {
    deny all;
}

それらはすべてコメントされコメントが外されましたが、何も助けませんでした。

PS Editionは/etc/nginx/sites-enabled/domainname.comファイルで作成されました。

47
Arthur Kushman

答えは、ルートディレクティブをロケーションディレクティブに配置することです。

root   /srv/www/ducklington.org/public_html;
17
Arthur Kushman

あなたのロケーションブロックであなたができること:

location / {
  try_files $uri $uri/index.html;
}

これにより、ngingxは最初に指定された正確な名前のファイルを検索し、そのようなファイルが見つからない場合はuri/index.htmlを試行します。 https://www.example.com/ のリクエストが来ると、最初に完全に一致するファイルを探し、それが見つからない場合はindex.htmlをチェックします

45
cobaco

location / {は最も一般的な場所です(location {を使用)。 AFAIU のいずれにも一致します。サイトのすべてのサブディレクトリに多くのコンテンツが重複しているため、location / { index index.html; }を使用するのが有用であるとは思いません。

とのアプローチ

try_files $ uri $ uri/index.html index.html;

上記のコメントで述べたように、サイトに存在してはならないページに対してindex.htmlを返します(可能な$uriはその結果になります)。また、上記の回答で述べたように、try_filesの最後の引数には内部リダイレクトがあります。

あなたのアプローチ

location = / {
   index index.html;

indexも内部リダイレクトを行うため、これも悪いです。必要な場合は、特定のlocationでそれを処理できる必要があります。作成する.

location = /index.html {

提案されたように ここ 。しかし、そうすればhttp://example.org/index.htmlというリンクが機能することになりますが、これは望ましくない場合があります。私が使用する別のバリ​​アントは次のとおりです。

root /www/my-root;

# http://example.org
# = means exact location
location = / {
    try_files /index.html =404;
}

# disable http://example.org/index as a duplicate content
location = /index      { return 404; }

# This is a general location. 
# (e.g. http://example.org/contacts <- contacts.html)
location / {
    # use fastcgi or whatever you need here
    # return 404 if doesn't exist
    try_files $uri.html =404;
}

追伸 debug nginxは非常に簡単です(バイナリで許可されている場合)。 server {ブロックに追加するだけです:

error_log /var/log/nginx/debug.log debug;

すべての内部リダイレクトなどが表示されます。

32

ドキュメントによると、指定された順序でファイルの存在を確認し、最初に見つかったファイルを要求処理に使用します。処理は現在のコンテキストで実行されます。ファイルへのパスは、ルートおよびエイリアスディレクティブに従ってfileパラメーターから構築されます。名前の最後にスラッシュを指定することにより、ディレクトリの存在を確認できます。 「$ uri /」。ファイルが見つからなかった場合、最後のパラメーターで指定されたURIへの内部リダイレクトが行われます。重要

最後のパラメーターで指定されたURIへの内部リダイレクトが行われます。

したがって、最初の2つのパラメーターがfalseを返す場合、最後のパラメーターにページまたはコードを追加する必要があります。

location / {
  try_files $uri $uri/index.html index.html;
}
4
Nokors

私にとって、(現在最も多く投票されている)回答のtry_filesディレクティブ https://stackoverflow.com/a/11957896/608359 は、書き換えサイクルにつながりました。

*173 rewrite or internal redirection cycle while internally redirecting

インデックスディレクティブの方が幸運でした。名前の前にスラッシュを使用したことに注意してください。これは、必要な場合とそうでない場合があります。

server {
  listen 443 ssl;
  server_name example.com;

  root /home/dclo/example;
  index /index.html;
  error_page 404 /index.html;

  # ... ssl configuration
}

この場合、404を返すときを含め、すべてのパスが/index.htmlにつながるようにしたかったのです。

0
Douglas Lovell