找不到具有相同路径的不同目录的文件的Nginx回退

时间:2014-05-15 20:47:50

标签: angularjs nginx

简短版本:有没有简单的方法可以自动将 /templates/my_child_theme/main/sidebar/user_nav.html 等路径重定向到 / templates /默认/ main / sidebar / user_nav.html 只要遇到404?

问题:是否有一种简单的方法可以在nginx中使用类似try_files的内容来更改文件路径,当找不到最后具有相同文件路径的其他文件夹时?我目前正在使用客户端框架(AngularJS)并且处理检查文件是否存在相当昂贵,因为我在为执行逻辑交换输出之前逐字地为每个文件执行AJAX调用并查找404 Javascript中的路径。我已经看到类似的后备图像解决方案,但还没有得到一个很好的解决方案。以下是我要做的事情的要点:

  1. 在/ templates / $ 1 / $ 2找文件。
  2. 在HTTP 404上,而不是return / templates / default / $ 2.
  3. 现在只需要在/ templates /位置发生这种情况。
  4. 这些文件可能嵌套了几层,所以我需要像 /templates/my_child_theme/main/sidebar/user_nav.html 这样重定向到 / templates / default / main /sidebar/user_nav.html
  5. 背景故事: 我一直在AngularJS中构建一个具有相当复杂的模板设置的站点。我正在利用Angular UI中令人敬畏的ui-router模块进行深度嵌套视图,并编写了一些自定义函数来实现类似于Magento的后备系统的子主题。以下是目前发生的情况:

    AngularJS使用我编写的getTemplate()函数请求模板路径,该函数首先通过执行XMLHttpRequest查找/ templates / child_theme_name_here / filepath 中的文件,检查状态代码为404(文件未找到),然后返回该路径或(在404的情况下)返回/ templates / default / filepath

    通过这种方式,我可以重载修改特定模板,而无需每次都复制整个主题,使开发更容易(我们有3个主要的企业客户,每个都有自己的品牌子主题),不让我跟上每个变化跨多个主题。

    如果在AngularJS中有更好的方法可以做到这一点,我也对此持开放态度,在我看来,Nginx将是执行此类操作的最合理的地方,因为它与它的低级集成文件系统。

1 个答案:

答案 0 :(得分:1)

<强>解决。

不得不在正则表达方面教自己一点,但最后还是让它运转了。

这是有效的:

location ~* ^\/templates\/([^\/\\\]+)(.*)$ {
        try_files /templates/$1$2 /templates/default$2 =404;
    }

正则表达式解释

  • 〜* 表示不区分大小写的匹配(不是真正的正则表达式,只是nginx语法)
  • ^ 表示字符串的开头
  • \ / 表示匹配反斜杠 模板意味着字面上匹配单词模板
  • \ / 表示再次匹配反斜杠
  • 表示开始捕获以下匹配作为一个组供以后使用
  • [^ \\\ /] 表示匹配任何不是反斜杠或正斜杠的东西意味着前一组字符可以多次匹配(即保持匹配任何不是斜杠的东西。
  • 表示停止捕获此群组的字符。我们现在已经定义了表示/ templates /
  • 之后的第一个文件夹的字符串
  • (。*)表示根据需要多次匹配任何其他字符(换句话说,不匹配换行符)
  • $ 表示匹配字符串的结尾

try_files然后按顺序尝试每个URL

  • / templates / $ 1 $ 2 表示尝试/ templates /(上面的捕获组1中的所有内容,其中包含我们捕获的文件夹)(然后添加捕获组中的所有内容,其中包含反斜杠和其后的任何内容)直到网址结束)
  • / templates / default $ 2 非常相似,除了使用捕获组1中的文本($ 1,我们匹配的文件夹名称),我们使用文本“default”,然后添加来自
  • 之前的第二个捕获组到底
  • = 404 表示如果这两个都不起作用,则返回404错误

我通过将这种回退机制转移到服务器而不是我之前在客户端上被迫做的所有无关呼叫,看到了显着的速度提升。