Nginx - 静态文件与root和别名混淆

tre*_*der 422 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;
            }
    }
Run Code Online (Sandbox Code Playgroud)

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

如果我激活root和停用alias- 它会停止工作.但是,当我/static/root它删除尾随它开始再次工作.

有人可以解释发生了什么.还请解释清楚和冗长之间有什么区别rootalias和它们的用途.

tre*_*der 986

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

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

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

为了显示:

假设我们有配置

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Nginx将推导出的最终路径

/var/www/app/static/static
Run Code Online (Sandbox Code Playgroud)

404由于内部没有static/,因此将返回static/

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

location /static/ {
    root /var/www/app/;
    autoindex off;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,随着alias位置部分掉落.所以对于配置

location /static/ {
    alias /var/www/app/static/;
    autoindex off;
}
Run Code Online (Sandbox Code Playgroud)

最终路径将正确形成为

/var/www/app/static
Run Code Online (Sandbox Code Playgroud)

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

  • 别名路径上的尾部斜线是必不可少的! (79认同)
  • 这一切都很棒(它帮助我解决了配置问题),但我想知道人们可以使用哪些日志记录设置来帮助诊断此类问题?就像,任何会打印到日志的东西,比如“收到 [...] 的请求,与“位置 [...]”配置块匹配,搜索目录 [...]” (5认同)
  • @Pistos:把`log_format 脚本'$document_root | $uri | > $request';` 进入`http` 部分和`access_log /var/log/nginx/scripts.log 脚本;` 进入nginx 配置的`server` 部分.. (3认同)

liu*_*jun 85

就像@treecoder一样

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

一张图片胜过千言万语

用于root:

在此输入图像描述

用于alias:

在此输入图像描述

  • 第二张图片中的第一个箭头应该是"+"吗? (9认同)
  • 如果一张图片不能供有视力障碍的用户访问,那么它就等于 0 个字 (3认同)

ant*_*tov 33

你的情况,你可以使用root指令,因为$uri该部分location指令是与去年相同的root指令部分.

Nginx文档也提供了它:
当location匹配指令值的最后一部分时:

location /images/ {
    alias /data/w3/images/;
}
Run Code Online (Sandbox Code Playgroud)

最好使用root指令:

location /images/ {
    root /data/w3;
}
Run Code Online (Sandbox Code Playgroud)

root指令将附加$uri到路径.

  • 为什么会更好?文件也不说。 (2认同)

mel*_*oly 20

只是@ 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;
 }
Run Code Online (Sandbox Code Playgroud)

  • @Mina如果可以的话最好使用root。(文档中有一条评论http://wiki.nginx.org/HttpCoreModule#alias) (3认同)
  • 谢谢你的回答.我知道这是3年之后,但有人可以解释在使用别名和root之间是否存在性能和/或安全性权衡? (2认同)

Yao*_*hao 8

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

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

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

alias并且root不能在位置块中一起使用。