Nginx 位置匹配多个扩展,除非路径以特定单词开头

Nginx 位置匹配多个扩展,除非路径以特定单词开头

如何编写与以下扩展名结尾的任何路径匹配的位置块:

jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html

除非路径以“/rails”开头(例如:/rails/randomstring/image.png)?

我目前有这个基本块:

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
  gzip_static on;
  gzip on;
  expires max;
  add_header Cache-Control public;
}

但这会匹配“/rails/randomstring/image.png”而我不想要这个。

答案1

您可以使用location ^~定义,例如:

location ^~ /rails/ {
    # your directives for "/rails/..." URIs here
}

location ~* \.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
    gzip_static on;
    gzip on;
    expires max;
    add_header Cache-Control public;
}

根据文档

如果最长匹配的前缀位置有“^~”修饰符,则不检查正则表达式。

更新

不声明额外块的另一种方法location是使用负正则表达式断言:

location ~ ^(?!/rails/).*\.(jpg|jpeg|gif|css|png|js|ico|json|xml|txt|html)$ {
    gzip_static on;
    gzip on;
    expires max;
    add_header Cache-Control public;
}

答案2

地点出于安全考虑,“/rails”块位于定义块的上方。

引自 nginx 位置描述

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。

相关内容