Nginx静态文件服务与root &amp混淆;别名

我需要服务我的应用程序通过我的应用服务器在8080,我的静态文件从一个目录,而不接触应用程序服务器。

    # 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,它将停止工作。然而,当我从root中删除后面的/static/时,它又开始工作了。

有人能解释一下这是怎么回事吗?

372698 次浏览

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

# EYZ0

  • location部分被附加到root部分
  • 最终路径= root + location

# EYZ0

  • location部件替换为alias部件
  • 最终路径= 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;           ↑
}                            |
pay attention to this trailing slash

最终路径将正确地形成为

/var/www/app/static

在某种程度上,这是有道理的。alias只是让您定义一个新路径来表示现有的“真实”;路径。位置部分是新路径,因此它被替换为实际路径。把它看作一个符号链接。

另一方面,根并不是一个新的路径,它包含一些信息,这些信息必须与其他信息进行整理才能形成最终路径。因此,位置部分被使用,而不是被丢弃。

alias中使用尾随斜杠的情况

对于每个Nginx的文档是否必须使用后面的斜杠,没有明确的指导方针,但这里和其他地方的人们的普遍观察似乎表明它是强制性的。

还有一些地方对此进行了讨论,但并不是结论性的。

https://serverfault.com/questions/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas < a href = " https://serverfault.com/questions/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas " > < / >

https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working < a href = " https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working " > < / >

只是@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;
}

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

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

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

最好使用root指令:

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

root指令将追加$uri到路径。

比如@treecoder

对于root指令,完整的路径被附加到根目录中,包括位置部分,而对于alias指令,只有不包括位置部分的路径被附加到别名中。

一幅图胜过千言万语

# EYZ0:

enter image description here

# EYZ0:

enter image description here

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上运行静态页面。

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

因此,alias是一个不同的名称,它将某个URI映射到文件系统中的某个路径,而root将位置参数附加到作为root指令参数的根路径上。

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

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

alias只能在位置块中使用,它将覆盖外部的root

aliasroot不能同时在location block中使用。

虽然我的答案是不需要的,但我认为有必要补充这一点,rootalias的工作方式不同,当涉及到regex。

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

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

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

在这种情况下,匹配的url将添加根,nginx将搜索/var/www/static/my.png