Maison  >  Article  >  développement back-end  >  Le mécanisme de proxy inverse nginx résout les problèmes inter-domaines front-end

Le mécanisme de proxy inverse nginx résout les problèmes inter-domaines front-end

小云云
小云云original
2018-03-30 14:48:342248parcourir

Cross-domain signifie que la page a souhaite obtenir les ressources de la page b. Si les protocoles, les noms de domaine, les ports et les noms de sous-domaines des pages a et b sont différents, ou si la page a est une adresse IP et la page b l'est. une adresse de nom de domaine, l'action d'accès effectuée Ils sont tous inter-domaines et les navigateurs restreignent généralement l'accès entre domaines pour des raisons de sécurité, c'est-à-dire que les demandes de ressources entre domaines ne sont pas autorisées.

La situation inter-domaines est la suivante :


Oui
url Description Que ce soit inter-domaines
http://www.cnblogs.com/a .js
url 说明 是否跨域
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 是(cookie不可访问)
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上)
http://www.a.com/b.js
Différents noms de domaine
http://www.a.com/lab/a .jshttp:/ /www.a.com/script/b.js Différents dossiers sous le même nom de domaine Non
http://www.a .com:8000/a.jshttp://www.a.com/b.js Le même nom de domaine, des ports différents Oui
http:/ /www.a.com/a.jshttps://www.a.com/b.js Le même nom de domaine, différents protocoles Oui td>
http ://www.a.com/a.jshttp://70.32.92.74/b.js Nom de domaine et nom de domaine IP correspondant Oui td>
http ://www.a.com/a.js http://script.a.com/b.js Le domaine principal est le même, le sous-domaine est le même. Les domaines sont différents Oui (le cookie n'est pas accessible)
http://www.a.com /a.jshttp://a.com/b.js Même nom de domaine, noms de domaine de deuxième niveau différents (comme ci-dessus) Solutions inter-domaines courantes

Actuellement, il n'existe aucune technologie qui ne s'appuie pas sur le serveur pour demander des ressources entre domaines

 1.jsonp nécessite que le serveur cible coopère avec une fonction de rappel .

2.window.name+iframe nécessite que le serveur cible réponde à window.name.

 3.window.location.hash+iframe nécessite également le serveur cible pour le traitement.

postMessage+ifrme de 4.html5 nécessite également que le serveur cible ou la page cible écrive un postMessage, se concentrant principalement sur la communication frontale.

5. CORS nécessite que le serveur définisse l'en-tête : Access-Control-Allow-Origin。

6. nginx reverse proxy Cette méthode est rarement mentionnée, mais elle ne nécessite pas de cible serveur Coopérez, mais vous devez configurer un serveur relais nginx pour transmettre les demandes.

Le proxy inverse nginx résout les problèmes inter-domaines

Comme mentionné ci-dessus, interdire les problèmes inter-domaines est en fait un comportement de sécurité des navigateurs, et la plupart des solutions actuelles utilisent des balises ou des failles. techniques d'accès inter-domaines, mais elles nécessitent toutes que le serveur cible apporte les modifications correspondantes. J'ai récemment rencontré une exigence selon laquelle le serveur cible ne peut pas me donner d'en-tête, et encore moins modifier le code pour renvoyer un script, donc les 5 options précédentes. ont été rejetés par moi. Enfin, comme mon site Web est mon propre hébergeur, j'ai décidé de créer un nginx et de déployer le code correspondant sous celui-ci. La page demande une adresse de ce nom de domaine, et l'agent nginx la traite et renvoie le résultat à la page. ça, tout est synchronisé.

À propos de nginxConfiguration et installation de baseVeuillez consulter mon autre blog, ce qui suit expliquera directement comment configurer un proxy inverse.

Recherchez d'abord nginx.conf ou nginx.conf.default ou cette partie par défaut


Où le serveur représente un service démarré et l'emplacement est une règle de positionnement.

location /{   #所有以/开头的地址,实际上是所有请求
 
root  html     #去请求../html文件夹里的文件,其中..的路径在nginx里面有定义,安装的时候会有默认路径,详见另一篇博客
 
index  index.html index.htm  #首页响应地址
 
}

Comme vous pouvez le voir ci-dessus, l'emplacement est le point d'entrée utilisé par nginx pour le routage, nous compléterons donc notre proxy inverse dans l'emplacement ensuite.

  假如我们我们是www.a.com/html/msg.html 想请求www.b.com/api/?method=1¶=2;

  我们的ajax:

var url = 'http://www.b.com/api/msg?method=1¶=2';
<br>$.ajax({
type: "GET",
url:url,
success: function(res){..},
....
})

上面的请求必然会遇到跨域问题,这时我们需要修改一下我们的请求url,让请求发在nginx的一个url下。

var url = &#39;http://www.b.com/api/msg?method=1¶=2&#39;;
var proxyurl = &#39;msg?method=1¶=2&#39;;
//假如实际地址是 www.c.com/proxy/html/api/msg?method=1¶=2; www.c.com是nginx主机地址
 $.ajax({
type: "GET",
url:proxyurl,
success: function(res){..},
....
}) 

 再在刚才的路径中匹配到这个请求,我们在location下面再添加一个location。

location ^~/proxy/html/{
rewrite ^/proxy/html/(.*)$ /$1 break;
proxy_pass http://www.b.com/;
}

以下做一个解释

1.'^~ /proxy/html/ '

  就像上面说的一样是一个匹配规则,用于拦截请求,匹配任何以 /proxy/html/开头的地址,匹配符合以后,停止往下搜索正则。

2.rewrite ^/proxy/html/(.*)$ /$1 break;

  代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用,例如www.c.com/proxy/html/api/msg?method=1¶=2重写。只对/proxy/html/api/msg重写。

  rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。

  break代表匹配一个之后停止匹配。

3.proxy_pass

  既是把请求代理到其他主机,其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下:

不带/

location /html/
{
  proxy_pass http://b.com:8300; 
}

带/

location /html/ 
{ 
    proxy_pass http://b.com:8300/; 
}


上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/”。

  针对情况1,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会便问http://proxy_pass/html/test.jsp,将test/ 作为根路径,请求test/路径下的资源。

  针对情况2,如果访问url = http://server/html/test.jsp,则被nginx代理后,请求路径会变为 http://proxy_pass/test.jsp,直接访问server的根资源。

修改配置后重启nginx代理就成功了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn