nginx location 总结

匹配之前,URL会被预处理
  • 解码
  • 将包含.和..的相对路径去除
  • 将//两条斜线合并成一条/
匹配规则
  • 前缀字符串,正则表达式,两种location
    • ~*不区分大小写
    • ~区分大小写
  • 扫描所有prefix strings, remember this longest
  • 扫描所有regular expression, 匹配则停止
  • 如果没有regular expression匹配,最长前缀匹配的location将被使用
特例情况
  • 如果最长前缀location使用^~作为修饰符,则不再扫描正则表达式
  • 如果prefix strings使用=作为修饰符,并且完成匹配,则不再扫描其他location
nginx_location.png
场景举例

简介: 这个是一个前后端分开部署的项目,前端是SPA,其中有些js静态文件是来自后端,nginx需要分清楚哪些是后端路由,哪些是前端路由,哪些是静态文件路径。

  1. 静态文件。BASE_PATH/static (前端打包后的js,css,images以及各个模块的js文件,通过http://host/static/xxx访问)
  2. 前端路由。包含一些请求路径
  • /template/edit/1
  • taskflow/home/1/
  • ...
  1. 后端路由。可穷举
  • /static/core/js/paas_api.js
  • /jsi18n/gcloud/
  • ...
upstream sops_server {
    server sops:8000;
}

server {

    listen 80;
    server_name stage.xxx.com;
    root /app/bk-sops/static/stage/dist/;
    index index.html;
    access_log /app/nginx_log/access.log;
    error_log /app/nginx_log/error.log;

    location / {
        root /app/bk-sops/;
        index index.html;
        rewrite ^/.*$ /index.html break;
    }

    location /static/ {
        root /app/bk-sops/;
    }

    location ~ (/static/core/js/paas_api.js|account/|jsi18n|api|core/api|config/api|apigw|common_template/api|template/api/|taskflow/api/|appmaker/|pipeline/|analysis/|periodictask/api/) {
        proxy_pass http://sops_server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

}
  1. 后端路径可穷举,在整个server block里面不使用精准匹配和修饰符^~的情况下,正则表达式的优先级最高,因此第三个location列出所有后端路由
  2. 静态文件使用第二个location,最长prefix strings
  3. 其他的前端路由被重定向到index.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容