Nginx регулярное выражение местоположения - PullRequest
1 голос
/ 26 января 2020

На сайте c сайт содержит html файлов в каталогах для каждого языка http://example.com/en Например, местоположения / en / (engli sh) / es / (spani sh) Stati c файлы, включающие css направлены на сайт root, который работает, /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 раз. Как бы я сделал это, чтобы мне не нужно было дублировать местоположение для каждого кода языка? Можно ли захватить / двухбуквенный код языка? / и повторно использовать его в переписать?

Большое спасибо!

1 Ответ

1 голос
/ 27 января 2020

Нельзя использовать захват в операторе location для создания регулярного выражения в операторе rewrite. Регулярные выражения являются литералами и не могут быть построены с использованием переменных.

Однако вам не нужно ...

Оператор rewrite внутри вашего блока location видит только те URI, где значение между первыми двумя / s следует игнорировать.

Например:

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

Если все языковые коды имеют длину в два символа, вы можете обобщить далее с помощью:

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

Но есть много других решений, которые будут работать. Если это файлы stati c, rewrite может быть ненужным, например:

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