网关路由出现了问题,一个细节性的东西,在此记录以下,以供参考。
原配置文件:
spring:
application:
name: wf-gateway
cloud:
gateway:
routes:
- id: userserver
uri: lb://user-server
predicates:
# 此处为api/user/**
- Path=api/user/**
filters:
# 此处为api/(?<segment>.*), /$\{segment}
- RewritePath=api/(?<segment>.*), /$\{segment}
- id: orderserver
uri: lb://order-server
predicates:
- Path=api/order/**,/api/item/**
filters:
- RewritePath=api/(?<segment>.*), /$\{segment}
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
allowedHeader: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
生效的配置文件:
spring:
application:
name: wf-gateway
cloud:
gateway:
routes:
- id: userserver
uri: lb://user-server
predicates:
# 此处为/api/user/**
- Path=/api/user/**
filters:
# 此处为/api/(?<segment>.*), /$\{segment}
- RewritePath=/api/(?<segment>.*), /$\{segment}
- id: orderserver
uri: lb://order-server
predicates:
- Path=/api/order/**,/api/item/**
filters:
- RewritePath=/api/(?<segment>.*), /$\{segment}
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
allowedHeader: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
不同之处已在配置文件中标注出, - Path
和 - RewritePath
的请求路径最前方需要添加 /
字符
第二种方式
可以在nginx中就重写path路径地址,这样网关就可以维持原样,不必重写地址。
location /api/agentProxy/{
rewrite "^/api/(.*)$" /$1 break;
proxy_pass http://agentProxy;
proxy_set_header Host $host;
}
rewrite "^/api/(.*)" /$1 break
,路径重写^/api/(.*)$
:匹配路径的正则表达式,用了分组语法,把/api/以后的所有部分当做1组/$1
:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始),即/api/后面的所有。这样新的路径就是除去/api/以外的所有,就达到了去除/api前缀的目的break
:指令,常用的有2个,分别是:last、breaklast
:重写路径结束后,将得到的路径重新进行一次路径匹配break
:重写路径结束后,不再重新匹配路径。