虚拟服务器可拥有一个宿主目录和任意数量的其它目录,这些其它目录通常被称为虚拟目录。

nginx 没有虚拟目录的说法,因为 nginx 本来就根据目录设计并工作的。如果要把虚拟目录强硬插上一个 虚拟目录 的说法,那只有 alias 标签比较像。还有一个和 alias 相似的标签root,它们之间有何区别?

最基本的区别

alias 指定的目录是准确的, 作用可以理解为 linux 的 ln,给 location 指定一个目录。

root 指定目录的上级目录,并且该上级目录要含有 locatoin 指定名称的同名目录。

alias 使用注意

  1. 使用 alias 时,目录名后面一定要加”/“。

  2. 使用 alias 标签的目录块中不能使用 rewrite 的 break。

  3. alias 在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。

  4. alias 只能位于 location 块中

例子

1
2
3
location /abc/ {
alias /home/html/abc/;
}

在这段配置下,http://test/abc/a.html 就指定的是 /home/html/abc/a.html。这段配置亦可改成使用 root 标签:

1
2
3
location /abc/ {
root /home/html/;
}

这样,nginx 就会去找 /home/html/ 目录下的 abc 目录了,得到的结果是相同的。但是,如果我把 alias 的配置改成

1
2
3
location /abc/ {
alias /home/html/def/;
}

那么 nginx 将会直接从 /home/html/def/ 取数据,例如访问 http://test/abc/a.html 指向的是 /home/html/def/a.html

这段配置还不能直接使用 root 配置,如果非要配置,只有在 /home/html/ 下建立一个 def->abc的软 link(快捷方式)了。

一般情况下,在 location / 中配置 root,在 location /other 中配置 alias 是一个好习惯。

alias fast-cgi

nginx 在处理 php 脚本时,需要传递给 fastcgi 才能处理,下面是 fast-cgi 无法工作的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name pwta;
root html;

location /test/{
alias html/test/;
autoindex on;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

通过上面的配置, 我们发现, 访问/test/a.php, php 脚本并没有作用。为什么呢?答案在下面:

Adding alias will effectively overwrite the $document_root to whatever is the alias. Note that it will not affect $fastcgi_script_name or $request_filename. Using the new $document_root together with regex matching the file name, resolves to the script file

针对上面的配置我们要改成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name pwta;
index index.html index.php;
root html;

location /test/ {
alias html/test/;
}

location ~ ^/test/(.+\.php)$ { ### This location block was the solution
alias html/test/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$1;
include fastcgi_params;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

重启 nginx,php 文件解析生效

参考资料

http://down.chinaz.com/server/201111/1382_1.htm
http://stackoverflow.com/questions/10084137/nginx-aliaslocation-directive

本文地址 https://shaoshilei.com/2016-06/nginx-alias-and-location-directive.html