我需要通过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
时,它会再次开始工作。
有人可以解释发生了什么。另外,请清楚详细地解释root
和alias
之间的区别及其目的。
答案 0 :(得分:919)
我找到了我的困惑的答案。
root
和alias
指令之间存在非常重要的区别。这种差异存在于处理root
或alias
中指定的路径的方式中。
如果是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
答案 1 :(得分:75)
就像@treecoder一样
在
root
指令的情况下,完整路径附加到根,包括位置部分,而在alias
指令的情况下,只有路径中不包括位置部分的部分是附加到别名。
一张图片胜过千言万语
代表root
:
代表alias
:
答案 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)
虽然不需要我的回答,但我认为有必要添加这一点,root
和 alias
在涉及正则表达式时的工作方式不同。
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
。
alias
和root
不能一起在位置块中使用。