root 和 alias 都是 Nginx 中用于指定文件系统路径的指令,但它们的工作方式和使用场景有本质区别。理解它们的差异对正确配置静态资源或 PHP 路由非常重要。
一、核心区别
| 特性 | root | alias |
|---|---|---|
| 作用方式 | 将 URI 拼接到指定路径之后 | 将 URI 替换为指定路径 |
| 路径拼接逻辑 | root + URI | alias 路径直接替代 location 的 URI 部分 |
| 是否包含 location 路径 | 是(URI 全部保留) | 否(URI 中匹配 location 的部分被去掉) |
| 适用场景 | 通用,尤其适合根目录或标准路径映射 | 适合将某个 URI 映射到任意非标准目录 |
二、举例说明
场景 1:使用 root
location /static/ {
root /var/www;
}
- 请求:
http://example.com/static/style.css - Nginx 查找的文件路径:
/var/www+/static/style.css→/var/www/static/style.css
root会把整个 URI(包括/static/)拼接到root路径后面。
场景 2:使用 alias
location /static/ {
alias /var/www/assets/;
}
- 请求:
http://example.com/static/style.css - Nginx 查找的文件路径:
把/static/替换为/var/www/assets/→/var/www/assets/style.css
alias会去掉匹配的 URI 部分(/static/),再拼上后面的路径。
三、常见错误对比
错误用法:用 root 实现别名效果
# 想让 /static/ 指向 /var/www/assets/
location /static/ {
root /var/www/assets/; # 错误!
}
- 请求
/static/style.css→ 实际找的是:
/var/www/assets//static/style.css(多了一层/static/)→ 404
正确做法:用 alias
location /static/ {
alias /var/www/assets/;
}
四、特殊注意点
-
alias路径必须以/结尾(当 location 以/结尾时)
否则路径拼接错误(导致拼接的路径缺少/)。# 推荐 location /images/ { alias /data/pictures/; }Nginx 对 alias 的处理规则是:将匹配 location 的 URI 前缀部分替换为 alias 指定的路径,其余部分直接拼接。
-
root可以放在server或http块中,全局生效;alias只能在location块中使用。 -
在 PHP 配置中通常用
root,不用alias
因为fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;依赖$document_root(由root定义)。
若用alias,$document_root不会更新,会导致 PHP 文件路径错误。# 危险:在 PHP location 中用 alias location ~ \.php$ { alias /app/web/; # $document_root 仍是 server 级的 root! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 路径错! }正确做法:用
root,或手动指定SCRIPT_FILENAME:location ~ \.php$ { alias /app/web/; fastcgi_param SCRIPT_FILENAME /app/web$fastcgi_script_name; }
五、总结口诀
root是“加”:URI 全部加到路径后面。alias是“换”:把 location 匹配的部分换成指定路径。
| 需求 | 用哪个 |
|---|---|
网站根目录是 /var/www/html | root /var/www/html; |
把 /css/ 映射到 /opt/static/css/ | alias /opt/static/css/; |
| 配置 PHP-FPM | 优先用 root,避免路径混乱 |
Nginx中root与alias的区别
764

被折叠的 条评论
为什么被折叠?



