【问题标题】:Nginx location regex genericNginx 位置正则表达式通用
【发布时间】:2020-01-27 16:43:24
【问题描述】:

静态站点在每种语言的目录中都有 html 文件 http://example.com/en 例如位置 /zh/(英文) /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/ 并在重写中重用它?

非常感谢!

【问题讨论】:

  • 你试过(?:es|en|fr|ge...) 吗?使用 OR | 至少匹配一个。

标签: regex nginx nginx-location


【解决方案1】:

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

但是,您不需要...

location 块中的 rewrite 语句只看到应该忽略前两个 /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;
}

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多