Nginx位置正则表达式通用

时间:2020-01-26 20:28:08

标签: regex nginx nginx-location

静态网站的每种语言的目录中都有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 lang语言代码/并在重写中重复使用?

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

但是,您不需要...

rewrite块内的location语句中只能看到前两个/之间的值应被忽略的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;
}