子目录转子域名需通过nginx的rewrite指令配合permanent实现301重定向,将example.com/blog/xxx跳转至blog.example.com/xxx并保留路径、查询参数和锚点,同时需配置独立的子域名server块以避免404。

子目录转子域名,本质是把类似 example.com/blog/xxx 的请求,映射到 blog.example.com/xxx,同时让浏览器地址栏显示新域名。这不是简单的内部重写,而是需要客户端重定向(301 或 302),并确保路径参数完整传递。
核心思路:用 rewrite + permanent 实现跳转
关键在于匹配子目录路径、提取后续路径段、构造新子域名 URL,并返回永久重定向。常用写法如下:
-
匹配以 /blog/ 开头的请求:使用
^/blog/(.*)$捕获后面所有内容(包括参数) -
替换为子域名形式:用
https://blog.example.com/$1,其中$1是捕获的路径 - 用 permanent 标志返回 301:告诉搜索引擎和浏览器这是永久迁移,利于 SEO
典型配置示例(server 块内)
在监听主域名的 server 块中添加:
server {
listen 80;
server_name example.com;
# 子目录转子域名跳转
rewrite ^/blog/(.*)$ https://blog.example.com/$1 permanent;
# 其他 location 配置...
}
如果启用了 HTTPS,建议统一跳转到 HTTPS 子域名:
rewrite ^/blog/(.*)$ https://blog.example.com/$1 permanent;
注意子域名本身也要能响应
仅靠上面的 rewrite 不够——它只负责跳转,blog.example.com 必须有独立的 server 块或已配置好服务,否则用户跳过去会 404。例如需另配:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html;
}
保留查询参数和锚点
$1 默认包含路径后的全部内容,比如访问 example.com/blog/post?id=123#top,会跳转到 blog.example.com/post?id=123#top,无需额外处理。Nginx 的 $request_uri 变量虽更全,但此处用 $1 更精准、更安全,避免重复拼接。
避免循环跳转
确保子域名 server 块里不再有针对 /blog/ 的 rewrite,否则可能形成跳转循环。可在子域名配置中加日志或临时 return 测试是否生效:
- 先用
redirect测试,确认跳转逻辑正确后再换permanent - 检查 DNS 是否已解析
blog.example.com到当前服务器 IP - 若用 CDN 或代理,确认原始 Host 头未被覆盖,必要时配合
$host或server_name判断











