Wie führt Nginx eine domänenübergreifende Konfiguration durch, damit es die Anforderungsmethoden DELETE und PUT verwenden kann?
大家讲道理
大家讲道理 2017-05-16 17:15:58
0
2
1394

Hintergrundbeschreibung

Wir planen, eine Restful API auf Basis von Nginx zu entwerfen. Wir müssen DELETE- und PUT-Anfragemethoden verwenden und den domänenübergreifenden Zugriff unterstützen. Derzeit haben wir zwei Testdomänen lokaler virtueller Hosts. http://api.zlzkj.comhttp://127.0.0.1/api/web

Problembeschreibung

nginx.conf-bezogene domänenübergreifende Konfiguration

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;

Ajax-Anfrage

<!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>

Die DELETE-Anforderungsmethode kann in

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

In

werden Sie feststellen, dass die Anforderungsmethode in den OPTINOS-Modus gefiltert wird. Normalerweise sollte es sich um den DELETE-Modus handeln, was dazu führt, dass die 405-Methode des Servers nicht zulässig ist http://127.0.0.1/api/web/下访问http://api.zlzkj.com/admins/1

Ich habe auch einige verwandte Artikel über die Firewall gefunden. Es scheint, dass die DELETE-Anforderungsmethode normal über Domänen hinweg verwendet werden kann. Die Anforderungsmethode wurde domänenübergreifend in OPTINOS gefiltert und verursachte einen 405-Fehler.

Ist es ein Problem mit der Nginx-Version? Problem mit der Umgebungskonfiguration? Ich hoffe, Sie können mir einige Einblicke geben, danke.

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

Antworte allen(2)
某草草

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请求的服务,这个可以直接用nginx做,
在配置中,加一下如下的配置:

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; 
}
PHPzhong
$.ajax({
    url: 'http://api.zlzkj.com/admins/1',
    type: 'DELETE',
    dataType: 'JSON',
    crossDomain:true
});
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage