小编典典

Nginx——静态文件与根和别名混淆

all

我需要通过我的应用程序服务器提供我的应用程序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用途。


阅读 141

收藏
2022-03-07

共1个答案

小编典典

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

root
  • location部分附加到root部分
  • 最终路径 = root+location
alias
  • 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只需让您定义一条新路径来表示现有的“真实”路径。位置部分是新路径,因此它被替换为真实路径。将其视为符号链接。

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

2022-03-07