alias实现子版块独立部署:location /blog/ { alias /srv/blog-site/; }将url前缀替换为物理路径,需严格匹配斜杠、末尾带/,静态用try_files回退,php需重设script_filename为$request_filename,并注意配置顺序与权限隔离。

用 alias 为网站添加子版块目录,核心是让访问路径(比如 /blog/)直接指向一个**物理位置完全独立**的目录,不依赖主站 root,也不受其路径结构影响。只要配置准确、权限到位,就能做到“无缝”——用户无感知,URL干净,资源加载正常。
明确 location 与 alias 的匹配关系
alias 不是“加一层”,而是“换起点”。它把 location 匹配到的前缀整个替掉:
-
location /blog/ { alias /srv/blog-site/; }→ 请求/blog/logo.png实际读取/srv/blog-site/logo.png -
location /blog(没结尾斜杠)→ 匹配不严谨,易出错;必须写成/blog/ -
alias值末尾必须带/,否则 Nginx 会把路径拼错,比如alias /srv/blog-site会导致请求/blog/index.html去找/srv/blog-siteindex.html(缺斜杠,连在一起)
静态子版块:只需 alias + try_files 回退
如果子版块纯静态(HTML/CSS/JS/图片),配置极简:
- 确保
/srv/blog-site/下有index.html - 在 server 块中加入:
alias /srv/blog-site/;
try_files $uri $uri/ /blog/index.html;
}
这样既支持直接访问 /blog/about.html,也支持 SPA 路由(如 /blog/admin/users)回退到 index.html,无需后端参与。
动态子版块(如 PHP):必须重设 SCRIPT_FILENAME
若子版块含 PHP,Nginx 默认的 $document_root 仍指向主站根目录,会导致 “No input file specified”。必须覆盖参数:
- 在子版块 location 内单独配 PHP 处理块
- 关键:用
$request_filename,它已包含 alias 映射后的完整磁盘路径
alias /srv/blog-site/;
}
location ~ ^/blog/(.+\.php)$ {
alias /srv/blog-site/$1;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
避坑要点:顺序、权限、隔离
-
顺序很重要:把
location /blog/放在所有正则匹配(如location ~ \.(js|css|png)$)之前,否则静态资源会被主站规则拦截,路径错、MIME 错、404 -
权限要放开:Nginx 工作进程(如 www-data 或 nginx 用户)需对
/srv/blog-site/有读取和执行(x)权限,尤其目录上级也要有x才能进入 -
不混用 root 和 alias:同一个 location 里只用 alias;顶层
root保持不动,子版块完全隔离,互不影响











