regex - 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/并在重写中重用它?
非常感谢!
解决方案
您不能在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;
}
推荐阅读
- intellij-idea - Jetbrains Intellij 格式化代码样式问题
- c# - 使用 NSIS 安装程序安装的应用程序无法启动
- etl - 数据仓库建模
- javascript - 如何检测嵌套 div (React) 中的溢出?
- javascript - 猫鼬:如何按日期查找以给定输入开头的日期(如自动完成:25/01/2...,25/01..)
- python - 如果在 django 测试中调用该方法,如何禁用该方法的装饰器?
- git - Github 克隆和拉取
- r - 使用 R 抓取具有更多嵌套页面的多个网页
- ios - 如何在 SwitUI 中使用 .onDelete 从列表中删除项目
- ibm-cloud - IBM Watson Assistant:用于获取牙齿状态、牙齿位置作为实体或意图的聊天机器人?