You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:56:20