Nginx 中为博客配置多级目录固定链接,应使用 location ^~ /blog/ 块配合 try_files $uri $uri/ /blog/index.php?$query_string; 实现统一入口路由,确保 PHP 正确接收 REQUEST_URI 并支持 /blog/2024/05/post/ 等路径。

要在 Nginx 中为博客系统(如 WordPress 或自建 PHP 博客)配置支持多级目录的固定链接重写规则,核心是让所有非真实文件/目录的请求,都交由入口脚本(如 index.php)统一处理,并正确解析路径参数。Nginx 本身不读 .htaccess,必须在 server 或 location 块中显式配置。
明确匹配范围:用 location 精确限定博客路径
不要把重写规则写在全局 location / 下,否则会影响其他应用。应单独为博客子目录(例如 /blog/)设置 location 块,实现“目录级”控制:
- 使用前缀匹配
location ^~ /blog/(避免正则干扰,提升性能) - 或更严格的精确匹配
location /blog/(适用于路径固定且无嵌套别名场景) - 确保该 location 内不包含
root或alias冲突——若博客实际部署在/var/www/html/blog,推荐用root /var/www/html;,然后内部路径自动拼接
捕获多级路径并透传:用 try_files + $uri 按优先级回落
这是最健壮、推荐的方式,比纯 rewrite 更高效、更少出错。它不依赖正则捕获,而是让 Nginx 自动判断资源是否存在:
try_files $uri $uri/ /blog/index.php?$query_string;- 含义:先找真实文件(
$uri),再找真实目录($uri/),都找不到就交给/blog/index.php,并保留原始查询参数($query_string) - 这样
/blog/2024/05/my-post/、/blog/category/tech/、/blog/tag/nginx/全部能被正确路由,无需为每种结构单独写 rewrite 规则
兼容传统 rewrite 方式(需手动定义路径结构)
如果博客程序依赖特定 URL 格式(如年/月/文章名),也可用 rewrite 显式提取参数,但需注意顺序和 flag:
- 示例:匹配
/blog/2024/05/hello-world/→ 转为/blog/index.php?y=2024&m=05&slug=hello-world rewrite ^/blog/(\d{4})/(\d{2})/([^/]+)/?$ /blog/index.php?y=$1&m=$2&slug=$3 last;- 关键点:
last表示内部重定向,不暴露给浏览器;^和$锚定首尾,防止误匹配;[^/]+确保 slug 不含斜杠,支持多级目录名(如hello/world需额外处理) - 若需支持无限层级(如
/blog/a/b/c/d/),可用rewrite ^/blog/(.*)$ /blog/index.php?path=$1 last;,由 PHP 解析path
确保 PHP 正确接收路径信息
重写后,PHP 脚本需能识别原始请求路径,否则无法生成正确链接或解析路由:
- 在
fastcgi_params或 fastcgi 配置中,确认已设置:fastcgi_param SCRIPT_NAME /blog/index.php;(非SCRIPT_FILENAME) - 添加:
fastcgi_param PATH_INFO $fastcgi_path_info;,配合fastcgi_split_path_info指令分离路径与脚本部分(适用于需要PATH_INFO的框架) - WordPress 等程序通常依赖
$_SERVER['REQUEST_URI'],而该值在 Nginx 中默认可用,无需额外设置


















