配置反向代理

创建日期:2024-06-21
更新日期:2024-12-18

配置反向代理

参考:https://www.cnblogs.com/sxshaolong/p/11706223.html

1、编辑conf/nginx.conf,在location /配置中添加proxy_pass http://localhost:8080;。

2、配置多个server代理,注释掉server段的server_name,添加多个server段即可。

server { 
    listen *:8080; 
    #server_name  localhost; 
 
    location / { 
        proxy_pass http://localhost:8848/nacos/; 
        root   html; 
        index  index.html index.htm; 
    } 
} 

location匹配顺序

参考:https://www.cnblogs.com/gexiaoshan/p/10219844.html

参考:https://blog.csdn.net/qq_36486737/article/details/83141598

参考:https://blog.csdn.net/luweibin19/article/details/106764454/

1、以=开头表示精确匹配。

2、^~~ 开头表示uri以某个常规字符串开头,不是正则匹配。

3、~~ 开头表示区分大小写的正则匹配。

4、~~* 开头表示不区分大小写的正则匹配。

6、/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到。

顺序优先级:

(location =) > (location 完整路径) > (location ^~~ 路径) > (location ~~,~~* 正则顺序) > (location 部分起始路径) > (/)

URL重写

参考:https://blog.csdn.net/weixin_40545389/article/details/78597530

rewrite            [flag];

关键字      正则        替代内容          flag标记

参考文档

来源:https://www.cnblogs.com/gsgs/p/11497587.html

location

以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。

以^~~ 开头,表示uri以某个常规字符串开头,如果匹配到,则不继续往下匹配,不是正则匹配。

以~~ 开头,表示区分大小写的正则匹配;

以~~* 开头,表示不区分大小写的正则匹配

以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到

*注意 location xxx {} 其中xxx与括号之间很多时候需要空格,最好都加上

匹配顺序:

(location =) > (location 完整路径) > (location ^~~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

rewrite

rewrite只能放在 server{}, location{}, if{}中,并且只能对域名后的文件路径起作用。

执行顺序

执行server块的rewrite指令

执行location匹配

执行选定的location中的rewrite指令

语法

rewrite regex replacement [flag];

flag

这儿分为server级和location级,其中if可写在server和location中,分别对应server级和location级。同级别中执行顺序看书写顺序。

last : 不再执行同级rewrite,写在location中重新匹配location.

break : 不再执行同级rewrite,继续往下执行,不重新匹配location;

redirect : 返回302临时重定向,地址栏会显示跳转后的地址

permanent : 返回301永久重定向,地址栏会显示跳转后的地址

当不写flag时,再次循环同级匹配

if(condition)

当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false

直接比较变量和内容时,使用=或!=

~~ 正则表达式匹配

~~* 不区分大小写的匹配

!~~ 区分大小写的不匹配

-f和!-f 用来判断是否存在文件

-d和!-d 用来判断是否存在目录

-e和!-e 用来判断是否存在文件或目录

-x和!-x 用来判断文件是否可执行

其他

调试

default_type    application/json;

在locaiton中 return 200 '$uri xxx'

变量

set $a "1"

if ($a = "1") {
  return 302
}

proxy_pass

proxy_pass http:~/~/127.0.0.1:8008/;

这里只讨论在location中的proxy_pass;

1、 location 使用非正则匹配

location /api {

 # 1. proxy_pass http://127.0.0.1:8008/a;

 # 2. proxy_pass http://127.0.0.1:8008;

}

  1. 1中 端口后面有"/" ,访问/api/test → /a/test;(匹配剩余的地址为/test,再将地址拼接到代理地址中)
  2. 2中 端口后面没有"/" ,访问/api/test → /api/test

此处要注意,并不是uri最后是否有"/",是端口后面是否有"/"

2、location 使用正则匹配

location ~ /api/ {

  proxy_pass http://127.0.0.1:8008;

}

端口后面不加/,可行。

端口后面加/,则必须使用变量(任何变量都行,让其使用第3条规则)。因为代理地址会自动加上匹配剩余的uri,代理去正则匹配剩余的uri会使地址乱套。

3、如果proxy_pass后面有变量,直接去的那个地址,跳出1 2条规则。

举例

server {

  listen       80;

  rewrite /a(.*) /b$1;

  rewrite /b(.*) /c$1 last;

  rewrite /c(.*) /d$1 break;

  location / {

    if ($uri ~ /d/) {

      rewrite /d/(.*) /api/$1 last;

    }

    return 200 '$uri';

  }

  location /api {

    proxy_pass http://127.0.0.1:8000/test; #端口号后面有/,代理删掉/api。

  }

  location ~ /t/(.*)/t {

    proxy_pass http://127.0.0.1:8000/test1/$1;

    #proxy_pass http://127.0.0.1:8000/test1; 写法报错,必须使用变量,使用第3条代理规则。

  }

}

访问/test 返回 /test

访问/aaa 返回 /caa

访问/api 返回 /cpi

访问/d/dd 代理去 http:~/~/127.0.0.1:8000/test/dd

访问/ee/t/test2/t/every 代理去 http://127.0.0.1:8000/test1/test2