我在重定向方面遇到了 Spring boot 和 nginx 的问题,我有以下路径“www.dental-admin.test/back-dental-admin/microlens-service/swagger-ui.html”的一部分“ /back-dental-admin/" 使 nginx 将流量重定向到 localhost:8080 我有 spring cloud gateway 然后 "/microlens-service/" 的部分负责将网关重定向到相应的微服务,事情是当我尝试使用“www.dental-admin.test/back-dental-admin/microlens-service/swagger-ui.html”时,我被重定向到“www.dental-admin.test/back-dental-admin/microlens -service/login”,这是正常的,因为我有 spring security,但问题是当我点击登录按钮时,我被重定向到“www.dental-admin.test/microlens-service/login”,即“/back-dental-管理员/”消失。我曾尝试在 nginx 中使用“forward-headers-strategy: framework”和一些配置,但我唯一得到的是当我使用“www.dental-admin.test/back-dental-admin/microlens-service /swagger-ui.html”我被重定向到“www.dental-admin.test/back-dental-admin/back-dental-admin/microlens-service/login”,也就是说它复制了“/back-dental -admin/” 奇怪的是,它甚至没有点击登录,而是直接处于主要重定向状态。我将留下 nginx、spring gateway 和微服务的配置文件,以帮助我识别可能发生在我身上的事情。
这是 nginx 会议:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.dental-admin.test;
ssl_certificate /etc/nginx/ssl/dental-admin.test+1.pem;
ssl_certificate_key /etc/nginx/ssl/dental-admin.test+1-key.pem;
location / {
proxy_set_header Forwarded $http_forwarded;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://localhost:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /back-dental-admin/ {
proxy_set_header Forwarded $http_forwarded;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Prefix /back-dental-admin/;
proxy_pass http://localhost:8080/;
}
}
春季网关会议
server:
port: 8080
spring:
application:
zipkin: http://localhost:9411
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://www.dental-admin.test/"
allowedHeaders: "*"
allowedMethods: "*"
allowCredentials: true
discovery:
locator:
enabled: true
routes:
- id: auth-service-route
uri: lb://auth-service
predicates:
- Path=/auth-service/**
filters:
- AuthFilter
- RewritePath=/auth-service/(?<segment>.*), /$\{segment}
- id: client-service-route
uri: lb://client-service
predicates:
- Path=/client-service/**
filters:
- AuthFilter
- RewritePath=/client-service/(?<segment>.*), /$\{segment}
- id: user-service-route
uri: lb://user-service
predicates:
- Path=/user-service/**
filters:
- AuthFilter
- RewritePath=/user-service/(?<segment>.*), /$\{segment}
- id: microlens-service-route
uri: lb://microlens-service
predicates:
- Path=/microlens-service/**
filters:
- RewritePath=/microlens-service/(?<segment>.*), /$\{segment}
和微服务会议
server:
port: ${PORT:${SERVER_PORT:0}}
forward-headers-strategy: framework
spring:
application:
zipkin: http://localhost:9411
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
default-zone: http://localhost:8761/eureka
instance:
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
根据配置文件,我认为您的 nginx 配置和 Spring Cloud Gateway 配置都已正确设置转发标头。您的微服务配置可能存在问题。
在微服务配置文件中,您已将
forward-headers-strategy
设置为框架。这意味着 Spring 使用其默认的标头转发策略。
但是,这可能不足以满足您的特定场景。您可能需要配置要转发的其他标头,例如您在 nginx 配置中设置的 X-Forwarded-Prefix
标头。
也许您可以在微服务配置文件中定义自定义
ForwardedHeaderTransformer
bean。例如,以下 Link 是设置转发 X-Forwarded-Prefix
标头的转换器的良好参考。
我用这样的代码解决了这个问题:
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
return new ForwardedHeaderTransformer() {
@Override
public HttpHeaders apply(HttpHeaders headers) {
HttpHeaders transformed = new HttpHeaders();
headers.forEach((key, values) -> {
if (key.equalsIgnoreCase("X-Forwarded-Prefix")) {
transformed.addAll(key, values);
}
// add any other headers you need to forward here
});
return transformed;
}
};
}