账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Nginx 使用 proxy_pass 后在 Java 中 getRequestUrl() 的问题
    46
    0

    在做一个 CAS 系统,业务系统发现用户没有登录后引导跳转到 CAS。

    业务系统1域名:benchmark-1.xxx.com
    业务系统2域名:benchmark-2.xxx.com
    CAS域名:cas.xxx.com

    nginx 配置如下:

    server {
        listen 80;
        server_name cas.xxx.com;
    
        location / {
            proxy_pass http://localhost:8090;
        }
    }
    
    server {
        listen 80;
        server_name benchmark-1.xxx.com;
    
        location / {
            proxy_pass http://localhost:8095;
        }
    }
    
    server {
        listen 80;
        server_name benchmark-2.xxx.com;
    
        location / {
            proxy_pass http://localhost:8096;
        }
    }

    现在我访问业务系统1,http://benchmark-1.xxx.com/us...,发现没有登录,拦截器 redirect 请求到 http://cas.xxx.com/auth/login。在拦截器里面我获取了当前请求的 URL:

    String requestUrl = request.getRequestURL().toString();

    当页面跳转后观察到浏览器地址栏的主机变成了 localhost:8095

    http://cas.xxx.com/auth/login?redirectUrl=http://localhost:8095/user/get

    这样我的 CAS 就没有办法重定向回业务系统。我现在定位是 Nginx 配置 proxy_pass 的问题,但是不知道怎么改,请各位不吝赐教。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 傅家二少 普通会员 1楼
      在Nginx中使用`proxy_pass`指令进行反向代理时,客户端请求的实际URL会被Nginx转发到后端服务器(例如Java应用服务器),Java应用接收到的请求URL会是Nginx配置中`proxy_pass`指定的地址,而不是客户端原始的请求URL。 如果你在Java应用中通过诸如`HttpServletRequest.getRequestURL()`或`getRequestURI()`方法获取请求URL,得到的是经过Nginx转发后的URL,而非客户端原始请求的URL。 如果需要获取客户端原始请求的URL,可以通过以下方式: 1. 如果Nginx在转发请求时添加了特殊的HTTP头部,比如`X-Real-IP`、`X-Forwarded-For`(客户端IP)、`X-Forwarded-Proto`(协议:http/https)、`X-Forwarded-Host`(原始Host)和`X-Forwarded-Port`(原始端口)等,那么在Java应用中可以从这些头部信息中获取原始请求的信息。 2. 若Nginx未设置上述头部,你需要在Nginx配置中开启`proxy_set_header`来传递这些信息,例如: ```nginx location / { proxy_pass http://your-backend-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ``` 3. 在Java应用中,可以使用如下的代码片段来获取这些头部信息: ```java String xRealIp = request.getHeader("X-Real-IP"); String xForwardedFor = request.getHeader("X-Forwarded-For"); String xForwardedProto = request.getHeader("X-Forwarded-Proto"); String xForwardedHost = request.getHeader("X-Forwarded-Host"); // 根据这些信息,可以拼接出原始的请求URL String originalUrl = xForwardedProto + "://" + xForwardedHost + request.getRequestURI(); ``` 请注意,由于安全原因,处理这些头部信息时需要谨慎,确保它们不会被恶意利用。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部