博学笃行·盛德日新

Nginx的alias使用方法汇总


技术

官网使用说明

Syntax:	alias path;
Default:	—
Context:	location

Defines a replacement for the specified location. For example, with the following configuration

针对特定的location匹配进行替换。例如,如下的一段配置

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

on request of “/i/top.gif”, the file /data/w3/images/top.gif will be sent.

当请求为/i/top.gif时,这个文件/data/w3/images/top.gif将会发送给客户端。

The *path* value can contain variables, except $document_root and $realpath_root.

path的值可以是一个变量,但是不能是变量: $document_root$realpath_root

If alias is used inside a location defined with a regular expression then such regular expression should contain captures and alias should refer to these captures (0.7.40), for example:

如果alias在一个正则表达式的location中使用时,这个正则表达式应该要包含一个捕获,并且需要在alias指令中使用该捕获的值(0.7.40版本添加的功能),例如:

location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}

When location matches the last part of the directive’s value:

location的匹配规则和alias指令的最后部分相同时:

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

it is better to use the root directive instead:

那你最好使用root指令代替alias指令,但请注意去掉最后相同的部分:

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

永福的具体配置实验

server {
    listen 80;
    server_name  test.liaoyongfu.com;
    root /Users/yongfu/apps/openresty/html_a1;

    location / {
        root /Users/yongfu/apps/openresty/html;
    }

    # 当访问 /tt/index.html 时,实际访问的是/Users/yongfu/apps/openresty/html_b2/index.html
    location /tt {
        alias /Users/yongfu/apps/openresty/html_b2;
    }

    # 当访问 /dd/index.hmtl 时,实际访问的是 /Users/yongfu/apps/openresty/html_b2/index.html
    location /dd/ {
        alias /Users/yongfu/apps/openresty/html_b2/;
    }

    # 当访问 /ee/index.hmtl 时,实际访问的是 /Users/yongfu/apps/openresty/html_b2/index.html
    location /ee {
        alias /Users/yongfu/apps/openresty/html_b2/;
    }

    # 当访问 /ff/index.hmtl 时,实际访问的是 /Users/yongfu/apps/openresty/html_b2index.html
    # 当然这个文件是不存在的,会返回404
    location /ff/ {
        alias /Users/yongfu/apps/openresty/html_b2;
    }

    # 当访问 /cc/index.html 时,实际访问的是 /Users/yongfu/apps/openresty/html_b2/cc/index.html
    # 因为location的匹配规则和alias的最后是相同的,所以等价于
    # location /cc/ {
    #     root /Users/yongfu/apps/openresty/html_b2;
    # }
    location /cc/ {
        alias /Users/yongfu/apps/openresty/html_b2/cc/;
    }


   access_log logs/www/$host.log;
}

永福的结论

  1. 当要使用alias的替换功能时,最好将alias指令后的path带上/,否则可能导致最后的路径不匹配或非预期结果。
  2. 在不需要使用alias功能的时候,就不要使用,使用root指令。

评论