Nginx多目录配置简化:正则捕获路径变量的可行性问询
Nginx子目录配置简化方案
你之前的正则配置没生效,核心问题是没给location加上正则匹配标识——Nginx要求正则location必须以~(区分大小写)或~*(不区分大小写)开头,否则会被当成普通前缀location处理,根本不会按正则规则捕获路径。
下面提供两种可行的简化方案,无需逐个指定子目录:
方案一:合并正则location(匹配任意深度子目录)
location / { try_files $uri $uri/ /index.php?$args; } # 匹配任意层级的子目录应用,自动转发到对应目录的index.php location ~ ^(/(?:[^/]+/)+) { try_files $uri $uri/ $1index.php?$args; }
这个正则^(/(?:[^/]+/)+)会捕获所有包含至少一级子目录的路径(比如/a-random-website/、/something/wordpress/),$1就是捕获到的完整目录路径,当请求的文件/目录不存在时,自动转发到该目录下的index.php。
方案二:用rewrite规则统一处理(更简洁)
location / { try_files $uri $uri/ @rewrite; } location @rewrite { # 提取请求的父目录,转发到对应index.php rewrite ^(/.*)/[^/]+$ $1/index.php?$args last; # 根目录请求直接转发到根index.php rewrite ^/$ /index.php?$args last; }
先尝试访问文件或目录,不存在则跳转到@rewrite命名location,通过rewrite自动提取当前请求的父目录路径,转发到对应目录的index.php,完全无需逐个配置子目录。
注意事项
- 如果有个别子目录不需要这个规则,可以在前面加
^~前缀的location排除,比如location ^~ /no-rewrite/ { ... },这类前缀location优先级高于正则location。 - 修改配置后,记得用
nginx -t验证语法,再重启Nginx生效。
内容的提问来源于stack exchange,提问作者coldpumpkin
相关产品推荐
相关产品推荐

