位置指令不起作用


10

对于我的NGINX服务器,我设置了一个虚拟服务器,用于分发静态内容。目前,我正在尝试对其进行设置,以使图像具有到期日期。但是,当我为此创建一个位置指令时,一切都将导致404。

我的配置现在看起来像这样:

/srv/www/static.conf

server {
    listen                          80;
    server_name                     static.*.*;

    location / {
            root                    /srv/www/static;
            deny                    all;
    }

    location /images {
            expires                 1y;
            log_not_found           off;
            root                    /srv/www/static/images;
    }
}

注意,此文件包含在http指令内的/etc/nginx/nginx.conf中

我试图访问图像,在,让我们说...... static.example.com/images/screenshots/something.png。当然,该图像也存在于/srv/www/static/images/screenshots/something.png。但是,要说的地址不起作用,只会告诉我404 Not Found

但是,如果我删除location /images并更改location /为以下内容...

location / {
    root /srv/www/static;
}

有用!我在这里做错了什么?

Answers:


14

您的配置遵循nginx的配置陷阱。在配置nginx之前,您应该阅读它。

要回答您的问题,您不应root在位置中定义,只需定义一次,位置标签将自动允许您将访问权限分配给特定目录。

另外,请使用而不是为images目录定义自定义根try_files。在$uri将地图/images/与目录/static/images/

试试这个配置:

server {
    listen                          80;
    server_name                     static.*.*;
    root                            /srv/www;

    location /static/ {
            deny                    all;
    }

    location /images/ {
            expires                 1y;
            log_not_found           off;
            autoindex               off;
            try_files $uri static/images$uri;
    }
}

谢谢!我已经读过陷阱,但我想我的记忆使我失望了。尽管我为自己的目的对其进行了略微编辑,但此方法有效。
Jesse Brands

是的,我自己会不时地重新阅读其中的一部分,这是有原因的;它有一个单独的Wiki页面;)
糟糕2014年

如果定义root内部location是不好的做法,那么为什么他们会在docs / http / ngx_http_core_module.html#alias中自己使用它呢?(请参见“ 使用root指令代替 ”)的更正:好的,似乎在错误的地方是在某个位置而不是任何根中定义主根
aexl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.