Maison  >  Questions et réponses  >  le corps du texte

Comment Nginx effectue-t-il la configuration inter-domaines afin de pouvoir utiliser les méthodes de requête DELETE et PUT ?

Description du fond

Préparation à la conception d'une API Restful basée sur Nginx, qui nécessite les méthodes de requête DELETE et PUT et prend en charge l'accès inter-domaines. Actuellement, il existe deux domaines de test d'hôtes virtuels locaux. http://api.zlzkj.comhttp://127.0.0.1/api/web

Description du problème

Configuration inter-domaines liée à nginx.conf

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

demande ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    Resetful Api设计
    <script src="http://c.csdnimg.cn/public/common/libs/jquery/jquery-1.11.1.min.js"></script>
    <script>
        $.ajax({
            url: 'http://api.zlzkj.com/admins/1',
            type: 'DELETE',
            dataType: 'JSON'
        });
    </script>
</body>
</html>

La méthode de requête DELETE peut être utilisée normalement dans

http://api.zlzkj.com/下访问http://api.zlzkj.com/admins/1

Dans

, vous constaterez que la méthode de requête est filtrée en mode OPTINOS. Normalement, elle devrait être en mode DELETE, ce qui entraîne la méthode 405 du serveur non autoriséehttp://127.0.0.1/api/web/下访问http://api.zlzkj.com/admins/1.

J'ai également trouvé des articles connexes sur le mur. Il semble qu'une fois leur Nginx configuré comme ceci, la méthode de requête DELETE peut être utilisée normalement sur tous les domaines. Cependant, de mon côté, elle ne peut être utilisée que dans le même domaine. La méthode de requête sera filtrée dans OPTINOS sur la méthode des domaines, cela a provoqué une erreur 405.

Est-ce un problème avec la version Nginx ? Problème de configuration de l'environnement ? J'espère que vous pourrez me donner quelques idées, merci.

大家讲道理大家讲道理2713 Il y a quelques jours1343

répondre à tous(2)je répondrai

  • 某草草

    某草草2017-05-16 17:17:58

    La requête

    OPTIONS est spéciale. Cette méthode est utilisée pour demander au serveur de lui indiquer quelles autres fonctions et méthodes il prend en charge. OPTIONS请求比较特殊,该方法用于请求服务器告知其支持哪些其他的功能和方法。
    在跨域的时候,浏览器会自动发起一个OPTIONS请求。
    当你的服务器响应了OPTIONS请求的时候,会有类似如下的响应:

    Allow → GET,HEAD,POST,OPTIONS,TRACE
    Cache-Control → max-age=86400
    Connection → keep-alive
    Content-Encoding → gzip
    Content-Length → 20
    Content-Type → text/html
    Date → Thu, 30 Jun 2016 04:00:24 GMT
    Expires → Fri, 01 Jul 2016 04:00:24 GMT
    Server → bfe/1.0.8.14
    Vary → Accept-Encoding,User-Agent

    如果你的服务器没有处理响应OPTIONS,会有如下的响应:

    Connection → keep-alive
    Content-Encoding → gzip
    Content-Type → text/html
    Date → Thu, 30 Jun 2016 04:02:35 GMT
    Server → nginx/1.4.6 (Ubuntu)
    Transfer-Encoding → chunked

    可以看出,缺少了Allow响应头
    所以,你应该有处理这个OPTIONSEn cas de cross-domaine, le navigateur lancera automatiquement une requête OPTIONS.
    Lorsque votre serveur répondra à la requête OPTIONS, il y aura une réponse similaire à la suivante :

    if ($request_method = 'OPTIONS') { 
    add_header Access-Control-Allow-Origin *; 
    add_header Access-Control-Allow-Credentials true; 
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; 
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 
    return 204; 
    }
    🎜Si votre serveur ne traite pas la réponse OPTIONS, il y aura la réponse suivante : 🎜 rrreee 🎜On peut voir que l'en-tête de réponse Allow est manquant🎜Vous devriez donc avoir un service pour gérer cette requête OPTIONS. Cela peut être fait directement avec nginx. la configuration, ajoutez Voici la configuration suivante : 🎜 rrreee

    répondre
    0
  • PHPz

    PHPz2017-05-16 17:17:58

    $.ajax({
        url: 'http://api.zlzkj.com/admins/1',
        type: 'DELETE',
        dataType: 'JSON',
        crossDomain:true
    });

    répondre
    0
  • Annulerrépondre