Heim  >  Fragen und Antworten  >  Hauptteil

Wie führt Nginx eine domänenübergreifende Konfiguration durch, damit es die Anforderungsmethoden DELETE und PUT verwenden kann?

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.

大家讲道理大家讲道理2713 Tage vor1342

Antworte allen(2)Ich werde antworten

  • 某草草

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

    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; 
    }

    Antwort
    0
  • PHPz

    PHPz2017-05-16 17:17:58

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

    Antwort
    0
  • StornierenAntwort