Nginx 位置正则表达式通用

Nginx location regex generic

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

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

如果我现在想添加 40 种语言,我必须将上述位置复制 40 次,我该怎么做才能不必为每种语言代码复制位置, 是否可以捕获 /two letter lang code/ 并在重写中重用它?

非常感谢!

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

但是,您不需要...

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

例如:

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

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

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

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

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