php跨域和https访问http问题分析

发布于:2024-04-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

1、https的web访问http地址的资源

问题:请求状态status=(canceled)   

解决办法:把资源地址改成https的

/**
 * HTTP地址改成HTTPS地址
 * @param $url
 */
function changeHttp2Https(&$url){
    if(stripos($url, 'http://') !== false){
        $url = str_replace('http://','https://',$url);
    }
}

2、https的web访问http地址的资源

问题:请求状态status=(blocked:mixed-content)

mixed-contend解释是:出现这个问题的原因是因为 在https网站中发起的http请求被禁止。也就是在https的网站中引入了 http 的图片、css、javascript 等其他资源或文件,浏览器便会提示 “Mixed Content” 错误,这是因为http 的资源容易被恶意攻击者利用,可能会导致安全问题,浏览器认为网页不是完全安全的。

解决办法一:升级http资源为https。

解决办法二:请求当前web服务地址,再通过web服务器调用目标http资源,web服务器做中转,这样服务调服务就不会存在安全问题。

3、设置服务器允许跨域

问题1:

​Access to XMLHttpRequest at 'http://saas-purchase.com/api/demand/search' 
from origin 'http://192.168.1.1:8899' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
The 'Access-Control-Allow-Origin' header contains multiple values '*, *',
but only one is allowed. 

解决办法:( '*, *' 表示设置了两个跨域请求头)检查是否nginx和php代码重复设置了响应头,删除一个即可。

问题2:  

​Access to XMLHttpRequest at 'http://saas-purchase.com/api/demand/search' 
from origin 'http://192.168.1.1:8899'has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

解决办法:在nginx或代码中设置跨域响应头。

在代码中添加跨域响应头的办法:
(1) 在 项目入口中(index.php)文件设置添加以下三行:
header('Access-Control-Allow-Origin:*');//设置允许域名
header('Access-Control-Allow-Methods:POST,GET,PUT,DELETE,OPTIONS');//允许请求方法 
// 或者 header('Access-Control-Allow-Methods:*');
header('Access-Control-Allow-Headers:authorization,token,content-type,Authorization');//允许请求头名
// 或者 header('Access-Control-Allow-Headers:*');


(2) 添加成功之后,访问接口会返回Response Headers:
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Origin: *

4、OPTIONS请求

HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。POST请求的时候会自动发送一个OPTIONS的请求,服务器要支持这个请求,并响应status=200

<?php
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:*');
header('Access-Control-Allow-Headers:*');

$queryType = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : '';
if ( false !== stripos($queryType, 'OPTIONS')) {
    echo 200;
    exit;
}