Maison > Questions et réponses > le corps du texte
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.com
和http://127.0.0.1/api/web
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.
某草草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
响应头
所以,你应该有处理这个OPTIONS
En 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 : 🎜
rrreeePHPz2017-05-16 17:17:58
$.ajax({
url: 'http://api.zlzkj.com/admins/1',
type: 'DELETE',
dataType: 'JSON',
crossDomain:true
});