匹配之前,URL会被预处理
- 解码
- 将包含.和..的相对路径去除
- 将//两条斜线合并成一条/
匹配规则
- 前缀字符串,正则表达式,两种location
- ~*不区分大小写
- ~区分大小写
- 扫描所有prefix strings, remember this longest
- 扫描所有regular expression, 匹配则停止
- 如果没有regular expression匹配,最长前缀匹配的location将被使用
特例情况
- 如果最长前缀location使用^~作为修饰符,则不再扫描正则表达式
- 如果prefix strings使用=作为修饰符,并且完成匹配,则不再扫描其他location
场景举例
简介: 这个是一个前后端分开部署的项目,前端是SPA,其中有些js静态文件是来自后端,nginx需要分清楚哪些是后端路由,哪些是前端路由,哪些是静态文件路径。
- 静态文件。BASE_PATH/static (前端打包后的js,css,images以及各个模块的js文件,通过http://host/static/xxx访问)
- 前端路由。包含一些请求路径
- /template/edit/1
- taskflow/home/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;
}
}
- 后端路径可穷举,在整个server block里面不使用精准匹配和修饰符^~的情况下,正则表达式的优先级最高,因此第三个location列出所有后端路由
- 静态文件使用第二个location,最长prefix strings
- 其他的前端路由被重定向到index.html