OpenResty NGINX Lua动态根目录与URI重写配置问题求助
OpenResty 动态文件分发配置方案
针对你的需求,核心是通过内部重定向实现路径映射,同时保持地址栏不变。以下是两种可行的配置方案,均避免修改只读的document_root和外部重定向问题:
方案一:Lua 直接处理并内部转发
这种方式灵活性最高,适合复杂的动态判断场景:
server { listen 80; server_name your-domain.com; # 执行你的认证逻辑,需在 access 阶段设置登录状态标识 access_by_lua_block { # 替换成你已实现的认证逻辑,最终设置 ngx.ctx.is_login 为 true/false # 示例:ngx.ctx.is_login = ngx.var.cookie_auth_token ~= nil } location / { content_by_lua_block { local current_uri = ngx.var.uri # 处理根路径 / if current_uri == "/" then local target_uri = ngx.ctx.is_login and "/startpage/user/" or "/startpage/guest/" # 第三个参数设为 true 表示内部重定向,地址栏无变化 ngx.req.set_uri(target_uri, true) else # 处理其他路径,映射到 /html 前缀 ngx.req.set_uri("/html" .. current_uri, true) end # 转发到静态文件处理 location ngx.exec("@static_handler") } } # 专门处理静态文件的内部 location location @static_handler { root /path/to/your/base_dir; # 这里是包含 startpage、html 文件夹的上级目录 try_files $uri $uri/ =404; } }
关键说明:
ngx.req.set_uri的第三个参数true是核心:它触发内部重定向,仅在NGINX内部修改请求路径,不会向浏览器发送跳转响应,地址栏保持不变。- 避免直接修改
ngx.var.document_root:这个变量是只读的,强行修改必然报错,正确做法是通过路径重定向实现根目录的动态切换。
方案二:结合 Rewrite 与 Lua 变量
如果偏好使用NGINX原生指令,可通过Lua设置变量后配合rewrite实现:
server { listen 80; server_name your-domain.com; access_by_lua_block { # 认证逻辑,设置登录状态到 NGINX 变量 ngx.var.is_logged_in = ngx.ctx.is_login and "1" or "0" } # 根路径动态重写 rewrite ^/$ /startpage/${is_logged_in='1' ? 'user' : 'guest'}/? last; # 其他路径映射到 /html 前缀 rewrite ^/(.*)$ /html/$1 last; # 静态文件处理 location /startpage/ { root /path/to/your/base_dir; try_files $uri $uri/ =404; } location /html/ { root /path/to/your/base_dir; try_files $uri $uri/ =404; } }
注意事项:
- 确保
access_by_lua_block在rewrite之前执行,这样ngx.var.is_logged_in才能被正确赋值。 rewrite指令的last参数表示处理完当前规则后,重新匹配location,不会触发外部跳转。
常见问题排查
- 如果之前用
ngx.req.set_uri出现外部跳转,大概率是没加第三个参数true,默认参数为false会触发302跳转。 - 若静态文件404,检查
root路径是否正确,确保/path/to/your/base_dir/startpage/user和/path/to/your/base_dir/html确实存在对应的文件。
内容的提问来源于stack exchange,提问作者Tream
相关产品推荐
相关产品推荐

