首页 > 解决方案 > Nginx 位置正则表达式通用

问题描述

静态站点在每种语言的目录中都有 html 文件http://example.com/en 例如位置 /en/(英语)/es/(西班牙语)包含 css 的静态文件被定向到站点根目录,这有效,/ en/css/style.css -> 指向 /css/style.css

        location ~ "^/en/(img|js|css)" {
            rewrite                   ^/en(.*)$ $1 last;
        }
        location ~ "^/es/(img|js|css)" {
            rewrite                   ^/es(.*)$ $1 last;
        }

如果我现在想添加 40 种语言,我必须将上述位置复制 40 次,我将如何做到这一点,这样我就不必为每个语言代码复制位置,是否可以捕获 /two letter lang code/并在重写中重用它?

非常感谢!

标签: regexnginxnginx-location

解决方案


您不能在location语句中使用捕获来构造语句中的正则表达式rewrite。正则表达式是文字,不能使用变量构造。

然而,你不需要...

块内的rewrite语句只看到应该忽略location前两个 s 之间的值的 URI 。/

例如:

location ... {
    rewrite ^/[^/]+(/.*)$ $1 last;
}

如果所有语言代码都是两个字符长,您可以进一步概括:

location ~ "^/[a-z]{2}/(img|js|css)" {
    rewrite ^/[^/]+(/.*)$ $1 last;
}

但是,还有许多其他可行的解决方案。如果这些是静态文件,则rewrite可能是不必要的,例如:

location ~ "^/[a-z]{2}(/(img|js|css).*)$" {
    try_files $1 =404;
}

推荐阅读