支持与位置正则表达式和try_files的深层链接,无法重定向到foo / local /到foo / index.html

时间:2017-05-25 15:23:43

标签: regex nginx

我有一些GUI,它们都属于一般的TTP子域,并且都允许深层链接。具体来说,URL / TTP / app / site /应该使用 site 的统计信息加载名为 app 的GUI。使用/ ttp / app 使用默认站点加载相同的GUI。

这可以通过将/ ttp / app 和/ ttp / app / site / requests重定向到/ usr / share / html / ttp / app /index.html页面,该页面将解析剩余的网址,并确定在提供网站时支持哪个支持。

目前我的conf文件中有类似的内容(我正在使用嵌套位置来处理此处未包含的其他内容):

location /ttp {
    root /usr/share/nginx/html/ttp/;
    location ~ ^/foo/ {
         try_files $uri $uri/ /foo/index.html;
    }
    location ~ ^/bar/ {
         try_files $uri $uri/ /bar/index.html;
    }
    ... (one for each app)
}

这有效,但多余。我正在尝试使用正则表达式来整合它,这将覆盖所有具有单个位置的应用程序。我已经尝试了一些变体,最初的问题是贪婪的正则表达式抓住所有/ app / 网站 /而不仅仅是/ app /。非贪婪正则表达式的最佳尝试

location /ttp {
    index index.html
    root /usr/share/nginx/html/ttp/

    location ~ ^/((?U).*)/ {
        try_files $uri /$1/index.html;
    }
}

这给我一个关于重写或内部重定向周期的错误,同时内部重定向ti“/ttp/index.html”这似乎意味着它不够贪婪并且完全忽略了 app ,其中$ 1是一个null string。

是否有一些干净的方法来执行此操作,使用正则表达式或某些我不知道的指令?

1 个答案:

答案 0 :(得分:1)

您的示例存在缺陷 - 我认为您对其进行了简化,我们错过了在/ttp块进入外部location块后删除/ttp/foo/xxx前缀的部分。

您有一个URI结构/ttp/foo/index.html,您希望默认操作为foo,其中[^/]是应用的名称。

您可以使用非贪婪的正则表达式,但您可能会发现try_files字符类更容易用于匹配URI中的各个路径元素。

如果location /ttp { root /usr/share/nginx/html; try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^(/ttp/[^/]+)/ $1/index.html last; return 404; } 语句的最后一个元素需要重写,请使用命名位置。有关详情,请参阅this document

例如:

/ttp/foo/xxx

采用默认操作的location /ttp形式的任何URI都将重新输入/ttp/foo/index.html块,其URI为rootUsers - user_id, username, pass, data, etc... Devices - device_id, user_id (owner), device_data.... OpRecords - record_id, device_id, record_data_stuff... 参数以URI为前缀以形成本地路径。