• PHP 跨域资源共享 CORS 设定


    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

    它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

    详细介绍见: http://www.ruanyifeng.com/blog/2016/04/cors.html

    NGINX端:

       location / {
           ... 
        add_header 'Access-Control-Allow-Origin' *;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
           ...

      }

    或者 在 PHP代码中设定 (php代码中设置了, nginx就不要配置了, 二选一):

    <?php
    
    header('Access-Control-Allow-Origin:*');  // 设为星号,表示同意任意跨源请求。也可配置特定的域名可访问 如:  https://www.xxxx.com
    header('Access-Control-Allow-Methods:OPTIONS,POST,GET'); // 允许请求的类型
    header('Access-Control-Allow-Headers:Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin');
    header('Access-Control-Expose-Headers:Content-Length,Content-Range');

     

    服务重启后, 至此 web端可直接 JavaScript 访问该站点的资源, ajax 亦可。

    特别说明:
         非同源的请求,会额外产生一次 "预检"的请求 请求方法 : OPTIONS

    OPTIONS /cors HTTP/1.1
    Origin: http://api.bob.com
    Access-Control-Request-Method: PUT
    Access-Control-Request-Headers: X-Custom-Header
    Host: api.alice.com
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0...
    

      

    "预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

    除了Origin字段,"预检"请求的头信息包括两个特殊字段。

    (1)Access-Control-Request-Method

    该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT

    (2)Access-Control-Request-Headers

    该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header

    服务器收到"预检"请求以后,检查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。

    这个环节,由浏览器控制,用户无感知。

  • 相关阅读:
    C语言学习趣事_BT_C_Code_混乱编程代码分析_1
    随想系列_6_终于被我发现Microsoft的一个错误了
    C语言学习趣事_经典面试题系列_2
    C++_系列自学课程_第_2_课_牛刀小试
    PLC_自动化控制系统_1_简说自动化控制系统
    随想系列_5_乱七八糟
    Android Handler使用
    Android Layout 布局属性
    MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序【转】
    AndroidMenifest 有关SdkVersion 说明
  • 原文地址:https://www.cnblogs.com/taozi32/p/10417287.html
Copyright © 2020-2023  润新知