Nginx - 静态文件服务混淆root&别号

时间:2012-05-17 08:03:02

标签: nginx

我需要通过8080处的应用服务器提供我的应用,以及来自目录的静态文件,而无需触及应用服务器。我拥有的nginx配置是这样的......

    # app server on port 8080
    # nginx listens on port 8123
    server {
            listen          8123;
            access_log      off;

            location /static/ {
                    # root /var/www/app/static/;
                    alias /var/www/app/static/;
                    autoindex off;
            }


            location / {
                    proxy_pass              http://127.0.0.1:8080;
                    proxy_set_header        Host             $host;
                    proxy_set_header        X-Real-IP        $remote_addr;
                    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    }

现在,使用此配置,一切正常。请注意,root指令已被注释掉。

如果我激活root并停用alias - 它就会停止工作。但是,当我从/static/中删除尾随的root时,它会再次开始工作。

有人可以解释发生了什么。另外,请清楚详细地解释rootalias之间的区别及其目的。

8 个答案:

答案 0 :(得分:919)

我找到了我的困惑的答案。

rootalias指令之间存在非常重要的区别。这种差异存在于处理rootalias中指定的路径的方式中。

如果是root指令,完整路径会附加到根,包括位置部分 ,而在alias的情况下指令,只有路径不包括位置部分的部分会附加到别名

举例说明:

假设我们有配置

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}

在这种情况下,Nginx将派生的最终路径为

/var/www/app/static/static

这将返回404,因为static/

中没有static/

这是因为位置部分被附加到root中指定的路径。因此,使用root,正确的方法是

location /static/ {
    root /var/www/app/;
    autoindex off;
}

另一方面,使用alias,位置部分被删除。所以对于配置

location /static/ {
    alias /var/www/app/static/;
    autoindex off;
}

最终路径将正确形成为

/var/www/app/static

请参阅此处的文档:http://wiki.nginx.org/HttpCoreModule#alias

答案 1 :(得分:75)

就像@treecoder一样

  

root指令的情况下,完整路径附加到根,包括位置部分,而在alias指令的情况下,只有路径中不包括位置部分的部分是附加到别名。

一张图片胜过千言万语

代表root

enter image description here

代表alias

enter image description here

答案 2 :(得分:31)

在您的情况下,您可以使用root指令,因为$uri指令的location部分与上一个root指令部分相同。

  

Nginx documentation也建议:
  当location匹配指令值的最后一部分时:

location /images/ {
    alias /data/w3/images/;
}
     

最好使用root指令:

location /images/ {
    root /data/w3;
}

root指令会将$uri附加到路径上。

答案 3 :(得分:18)

只是@ good_computer非常有用的答案的快速补遗,我想用文件夹替换URL的根,但只有当它匹配包含静态文件的子文件夹时(我想将其保留为路径的一部分)。

例如,如果请求的文件位于/app/js/app/css,请查看/app/location/public/[that folder]

我使用正则表达式来实现这一点。

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

答案 4 :(得分:2)

server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

服务器阻止在nginx上生成静态页面。

答案 5 :(得分:1)

换句话说,保持简短:对于root,指定的location参数是文件系统的路径和URI 的一部分。另一方面,对于alias,位置声明的伪指令参数仅是 URI

的一部分

因此,alias是另一个名称,它将某些URI映射到文件系统中的某些路径,而root将location参数附加到作为root指令的参数给出的根路径。

答案 6 :(得分:1)

虽然不需要我的回答,但我认为有必要添加这一点,rootalias 在涉及正则表达式时的工作方式不同。

 location ~ /static/my.png$ {
 alias /var/www/static/;
 access_log off;
 expires max;}

在这种情况下,regex 匹配不会添加别名,nginx 将只搜索“/var/www/static/”而不是“/var/www/static/my.png”。您必须使用正则表达式捕获。

 location ~ /static/my.png$ {
 root /var/www;
 access_log off;
 expires max;}

在这种情况下,匹配的url将与root一起添加,nginx将搜索'/var/www/static/my.png'。

答案 7 :(得分:0)

alias用于替换请求路径中的位置部分路径(LPP),而root用于替换请求路径。

它们是将请求路径映射到最终文件路径的两种方法。

alias仅可用于位置限制,它将覆盖外部root

aliasroot不能一起在位置块中使用。