nginx跨域请求失败,proxy_poss后面的url不起作用 20C

nginx跨域请求失败,proxy_poss后面的url不起作用
介绍如下所述,
nginx.conf主要配置如下:
server {
listen 9096;
server_name spark1;
location / {
root /opt/nginx/pckydm; #存放的是首页
index index.html index.htm;
}

       location  /pckydm/ {
       proxy_pass   http://192.168.43.93:9095/;   #这是后台接口部署的地址
}

}
前后端分离开发与部署,能够访问首页,从首页发送请求访问后台接口
数据的url: http://spark1:9096/pckydm/login,
结果spark1:9096没有被替换为192.168.43.93:9095,为什么?
按理来说已经匹配的pckydm,url应该被改写为http://192.168.43.93:9095/login,
而仍然是 http://spark1:9096/pckydm/login
各位大佬知道是什么原因吗?大家有什么解决办法吗?望各位大佬不吝赐教。
小白我先在此跪谢

7个回答

 proxy_pass   http://192.168.43.93:9095/

你理解错了,这里的proxy_pass就是把你的请求转到192.168.43.93服务器,然后它的返回结果,nginx会再返回给你的客户端,这才是反向代理的原理
对于你客户端来说,你还是访问的spark1这个域名,它并不知道后台192.168.43.93的存在,只知道访问nginx。

一般跨域有四种解决方案:1.设置响应头,2.使用JSONP,这种是前端解决的,原理是将Ajax转换为标签,3、使用HttpClient转发<br> 4.接口网关,也是一般而言最佳的解决方案,也就是你的Nginx,或者使用SpringCloud网关。<br> nginx解决原理是:比如A网站ajax需要请求B网站的b.html,通过Nginx代理,nginx代理地址比如为C,<br> 那么nginx去调用A网站服务就是 http://C/a,调用B网站服务就是 http://C/B 那么需要请求B网站服务的b.html就是http://C/B/b.html</p> <p>而你的疑惑就是 为什么网址不会变为 http://B/b.html(<a href="http://192.168.43.93:9095/login%EF%BC%89%EF%BC%8C%E4%B9%8B%E6%89%80%E4%BB%A5%E4%B8%8D%E4%BC%9A%E5%8F%98%E5%B0%B1%E6%98%AF%E5%9B%A0%E4%B8%BAnginx%E5%90%A7B%E7%BD%91%E7%AB%99%E4%BB%A3%E7%90%86%E4%BA%86%EF%BC%8C">http://192.168.43.93:9095/login),之所以不会变就是因为nginx吧B网站代理了,</a><br> 外界不会知晓请求的是B服务器,你的请求都会被nginx代理,之后nginx根据你的请求调用不同的服务!!!<br> 你所说的匹配到pckydm,url应该被改写为<a href="http://192.168.43.93:9095/login%EF%BC%8C%E4%B9%9F%E5%B0%B1%E4%B8%8D%E6%88%90%E7%AB%8B%E4%BA%86%EF%BC%8C%E5%A6%82%E6%9E%9Curl%E6%94%B9%E4%BA%86%EF%BC%8C%E9%82%A3%E4%BD%A0%E5%AF%B9%E5%BA%94%E7%9A%84192.168.43.93%E5%92%8C%E7%AB%AF%E5%8F%A3%E4%B8%8D%E5%B0%B1%E9%83%BD%E6%9A%B4%E9%9C%B2%E4%BA%86%E5%90%97%EF%BC%81%EF%BC%81%EF%BC%81">http://192.168.43.93:9095/login,也就不成立了,如果url改了,那你对应的192.168.43.93和端口不就都暴露了吗!!!</a></p>

一般跨域有四种解决方案:
1.设置响应头,
2.使用JSONP,这种是前端解决的,原理是将Ajax转换为标签,
3、使用HttpClient转发
4.接口网关,也是一般而言最佳的解决方案,也就是你的Nginx,或者使用SpringCloud网关。



nginx解决原理是:比如A网站ajax需要请求B网站的b.html,通过Nginx代理,nginx代理地址比如为C, 那么nginx去调用A网站服务就是 http://C/a,调用B网站服务就是 http://C/B 那么需要请求B网站服务的b.html就是http://C/B/b.html
而你的疑惑就是 为什么网址不会变为 http://B/b.html(http://192.168.43.93:9095/login),之所以不会变就是因为nginx吧B网站代理了,外界不会知晓请求的是B服务器,你的请求都会被nginx代理,之后nginx根据你的请求调用不同的服务!!!

你所说的匹配到pckydm,url应该被改写为ttp://192.168.43.93:9095/login,也就不成立了,如果url改了,那你对应的192.168.43.93和端口不就都暴露了吗!!!

nginx采用的是反向代理,这种方式对用户透明,也就是说访问http://spark1:9096/pckydm/login到nginx,nginx匹配的url,然后将请求地址改成http://192.168.43.93:9095/login,然后自己发出请求,并把结果返回给用户。

一共有两种方式forword和redict,这里nginx本质上是一种forword,代理该请求只对结果负责。如果按照你的想法本质上是重定向,把控制权交给用户,用户发起第二次请求。

如果是做前后端分离,你这样已经基本上是分离了,给前端单独出一个目录用于前端地址,剩下的给后端。

如果是跨域失败,问题不在nginx上,只需要在服务器返回的时候在response的header中添加:

        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
 location  /pckydm/ {
       proxy_pass   http://192.168.43.93:9095/;   
}

你这样写访问 http://spark1:9096/pckydm/login的时候实际访问的地址是http://192.168.43.93:9095/pckydm/login

  1. 如果proxy_pass的URL定向里包括URI,那么请求中匹配到location中URI的部分会被proxy_pass后面URL中的URI替换,eg:
 location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

请求http://127.0.0.1/name/test.html 会被代理到http://example.com/remote/test.html
  1. 如果proxy_pass的URL定向里不包括URI,那么请求中的URI会保持原样传送给后端server,eg: > location /name/ { > proxy_pass http://127.0.0.1; > } > > 请求http://127.0.0.1/name/test.html 会被代理到http://127.0.0.1/name/test.html
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐