我有3个域名,并试图使用Nginx在一台服务器上托管所有3个网站(一个数字海洋液滴)。

mysite1.name mysite2.name mysite3.name

只有1个有效。另外两个结果是403个错误(以同样的方式)。

在我的nginx错误日志中,我看到:[error] 13108#0: *1目录索引“/usr/share/nginx/mysite2.name/live/”被禁止。

我的站点启用配置是:

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;
        }
}

这三个站点都有几乎相同的配置文件。

每个站点的文件都在/usr/share/nginx/mysite1.name/someFolder这样的文件夹中,然后/usr/share/nginx/mysite1.name/live是指向该文件夹的符号链接。(mysite2和mysite3也是如此。)

我已经查看了Nginx 403禁止所有文件,但这没有帮助。

有什么问题吗?


当前回答

我解决了我的问题,如果我配置如下:

location = /login {
    index  login2.html;
}

它会显示403错误。

[error] 4212#2916: *2 directory index of "D:\path/to/login/" is forbidden

我试过自动索引,但不工作。 如果我改变我的配置像这样,它工作。

location = /login/ {
    index  login2.html;
}

我认为精确匹配,如果是路径,就应该是目录。

其他回答

检查目录中是否缺少index.html或index.php 查看位于/var/log/nginx目录下的错误日志文件,然后打开 vim error.log

我解决了我的问题,如果我配置如下:

location = /login {
    index  login2.html;
}

它会显示403错误。

[error] 4212#2916: *2 directory index of "D:\path/to/login/" is forbidden

我试过自动索引,但不工作。 如果我改变我的配置像这样,它工作。

location = /login/ {
    index  login2.html;
}

我认为精确匹配,如果是路径,就应该是目录。

如果你关闭了目录索引,并且遇到了这个问题,这可能是因为你正在使用的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

在我的例子中,它与CentOS 7中的SELinux有关:

使用如下命令查看是否已启用。

cat /etc/selinux/config

示例输出:

SELINUX=enforcing
SELINUXTYPE=targeted

永久禁用SELinux 编辑/etc/selinux/config文件,执行如下命令:

sudo vi /etc/selinux/config

将SELINUX设置为disabled:

SELINUX=disabled

在vi/vim中保存并关闭文件。重新启动Linux系统:

sudo reboot

更改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;
}