239

私は 3 つのドメイン名を持っており、Nginx を使用して 3 つのサイトすべてを 1 つのサーバー (Digital Ocean ドロップレット) でホストしようとしています。

mysite1.name mysite2.name mysite3.name

それらのうちの1つだけが機能します。他の 2 つは、(同じように) 403 エラーになります。

nginx エラー ログに次のように表示されます[error] 13108#0: *1 directory index of "/usr/share/nginx/mysite2.name/live/" is forbidden

私のサイト対応の構成は次のとおりです。

server {
        server_name www.mysite2.name;
        return 301 $scheme://mysite2.name$request_uri;
}
server {
        server_name     mysite2.name;

        root /usr/share/nginx/mysite2.name/live/;
        index index.html index.htm index.php;

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

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

3 つのサイトはすべて、ほぼ同一の構成ファイルを持っています。

各サイトのファイルは /usr/share/nginx/mysite1.name/someFolder のようなフォルダーにあり、/usr/share/nginx/mysite1.name/live はそのシンボリック リンクです。(mysite2 と mysite3 も同様です。)

すべてのファイルに対して禁止されている Nginx 403を見てきましたが、それは役に立ちませんでした。

何が間違っている可能性がありますか?

4

21 に答える 21

247

ディレクトリのインデックス作成がオフになっていて、この問題が発生している場合は、おそらく、使用している try_files にディレクトリ オプションがあるためです。

location / {
  try_files $uri $uri/ /index.html index.php;
}                 ^ that is the issue

それを削除すると、動作するはずです:

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

なぜこれが起こるのか

TL;DR: これは、nginx がディレクトリのインデックスを作成しようとして、それ自体でブロックされるために発生します。OPで言及されたエラーをスローします。

try_files $uri $uri/つまり、ルート ディレクトリから、 が指すファイルを試します。uri存在しない場合は、代わりにディレクトリを試します (したがって/)。nginx がディレクトリにアクセスすると、インデックスを作成してその中のファイルのリストをブラウザ/クライアントに返そうとしますが、デフォルトではディレクトリのインデックス作成は無効になっているため、「Nginx 403 エラー: [フォルダ] のディレクトリ インデックス」というエラーが返されます。禁止されています"。

ディレクトリのインデックス作成は、autoindexオプションによって制御されます: https://nginx.org/en/docs/http/ngx_http_autoindex_module.html

于 2016-06-27T04:49:26.753 に答える
74

動作する構成は次のとおりです。

server {
    server_name www.mysite2.name;
    return 301 $scheme://mysite2.name$request_uri;
}
server {
    #This config is based on https://github.com/daylerees/laravel-website-configs/blob/6db24701073dbe34d2d58fea3a3c6b3c0cd5685b/nginx.conf
    server_name mysite2.name;

     # The location of our project's public directory.
    root /usr/share/nginx/mysite2/live/public/;

     # Point index to the Laravel front controller.
    index           index.php;

    location / {
        # URLs to attempt, including pretty ones.
        try_files   $uri $uri/ /index.php?$query_string;
    }

    # Remove trailing slash to please routing system.
    if (!-d $request_filename) {
            rewrite     ^/(.+)/$ /$1 permanent;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #   # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}

その後、ブラウザーに出力されるのは Laravel エラーだけでした。「おっと、何か問題が発生したようです。」</p>

実行しないでくださいchmod -R 777 app/storage()。何かを誰でも書き込み可能にすることは、セキュリティが悪いことです。

chmod -R 755 app/storage動作し、より安全です。

于 2013-10-10T17:46:28.800 に答える
12

実際には、確認する必要があることがいくつかあります。1. nginx の実行ステータスを確認する

ps -ef|grep nginx

ps aux|grep nginx|grep -v grep

ここで、誰が nginx を実行しているかを確認する必要があります。ユーザーとグループを覚えておいてください

  1. フォルダのアクセス状況を確認する

    ls -alt

  2. nginxのフォルダーのステータスと比較します

(1) フォルダのアクセス状況が正しくない場合

sudo chmod 755 /your_folder_path

(2) フォルダのユーザーとグループが nginx の実行中のものと同じでない場合

sudo chown your_user_name:your_group_name /your_folder_path

nginxの実行中のユーザー名とグループを変更します

nginx -h

nginx構成ファイルの場所を見つける

sudo vi /your_nginx_configuration_file

//in the file change its user and group
user your_user_name your_group_name;

//restart your nginx
sudo nginx -s reload

nginx のデフォルトの実行中のユーザーは nobody であり、グループは nobody であるためです。このユーザーとグループに気付かないと、403 が導入されます。

于 2015-02-24T04:23:07.590 に答える
9

これは、Nginx ポリシー (例: "deny") が原因で発生したり、Nginx の構成ミスが原因で発生したり、ファイルシステムの制限が原因で発生したりする可能性があります。

それが後であるかどうかを判断できます(straceを使用して、設定ミスの証拠を確認できる可能性があります(ただし、OPはそれにアクセスできません):

# pidof nginx
11853 11852

# strace -p 11853 -p 11852 -e trace=file -f
Process 11853 attached - interrupt to quit
Process 11852 attached - interrupt to quit
[pid 11853] stat("/var/www/html/kibanaindex.html", 0x7ffe04e93000) = -1 ENOENT (No such file or directory)
[pid 11853] stat("/var/www/html/kibana", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
^CProcess 11853 detached
Process 11852 detached

ここでは、テストの実行中にnginxによって行われたファイルシステムのアクティビティを調べています(あなたと同じエラーがありました)。

これが当時の私の構成の選択された部分です

    location /kibana/3/ {
        alias /var/www/html/kibana;
        index index.html;
    }

私の場合、strace が非常に明確に示しているように、"エイリアス" を "インデックス" に結合することは、私が期待していたものではありませんでした。ディレクトリ名に常に / を追加する習慣を身に付ける必要があるようです。私の場合、以下が機能しました:

    location /kibana/3/ {
        alias /var/www/html/kibana/;
        index index.html;
    }
于 2015-09-26T19:06:18.777 に答える
5

try_filesパスを指すように変更index.phpします。あなたが言及した「Laravel」では、次のようになります

location / {
    try_files $uri $uri/ /public/index.php$request_uri;
}

そして、「codeigniter」プロジェクトでは、このようにしてみてください

location / {
    try_files $uri $uri/ /public_web/index.php$request_uri;
}
于 2013-10-10T08:13:34.717 に答える