如何编写与以下扩展名结尾的任何路径匹配的位置块:
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 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。