使用Nginx如何解决跨域问题?

为何会跨域?

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

Nginx如何解决跨域?

这里,我们利用Nginx的反向代理功能解决跨域问题,至于,什么是Nginx的反向代理,大家就请自行百度或者谷歌吧。

Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而Nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

Nginx解决跨域案例

使用Nginx解决跨域问题时,我们可以编译Nginx的nginx.conf配置文件,例如,将nginx.conf文件的server节点的内容编辑成如下所示。

  1. server {
  2. location / {
  3. root html;
  4. index index.html index.htm;
  5. //允许cros跨域访问
  6. add_header 'Access-Control-Allow-Origin' '*';
  7. }
  8. //自定义本地路径
  9. location /apis {
  10. rewrite ^.+apis/?(.*)$ /$1 break;
  11. include uwsgi_params;
  12. proxy_pass http://www.binghe.com;
  13. }
  14. }

然后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.binghe.com/apistest/test 变为 http://www.binghe.com/apis/apistest/test然后成功解决。

假设,之前我在页面上发起的Ajax请求如下所示。

  1. $.ajax({
  2. type:"post",
  3. dataType: "json",
  4. data:{'parameter':JSON.stringify(data)},
  5. url:"http://www.binghe.com/apistest/test",
  6. async: flag,
  7. beforeSend: function (xhr) {
  8. xhr.setRequestHeader("Content-Type", submitType.Content_Type);
  9. xhr.setRequestHeader("user-id", submitType.user_id);
  10. xhr.setRequestHeader("role-type", submitType.role_type);
  11. xhr.setRequestHeader("access-token", getAccessToken().token);
  12. },
  13. success:function(result, status, xhr){
  14. }
  15. ,error:function (e) {
  16. layerMsg('请求失败,请稍后再试')
  17. }
  18. });

修改成如下的请求即可解决跨域问题。

  1. $.ajax({
  2. type:"post",
  3. dataType: "json",
  4. data:{'parameter':JSON.stringify(data)},
  5. url:"http:www.binghe.com/apis/apistest/test",
  6. async: flag,
  7. beforeSend: function (xhr) {
  8. xhr.setRequestHeader("Content-Type", submitType.Content_Type);
  9. xhr.setRequestHeader("user-id", submitType.user_id);
  10. xhr.setRequestHeader("role-type", submitType.role_type);
  11. xhr.setRequestHeader("access-token", getAccessToken().token);
  12. },
  13. success:function(result, status, xhr){
  14. }
  15. ,error:function (e) {
  16. layerMsg('请求失败,请稍后再试')
  17. }
  18. });
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
java底层

底层原理

2021-5-12 17:18:58

nginx服务器

logstash收集nginx日志写入kafka

2021-6-22 17:47:32

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧