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

这篇具有很好参考价值的文章主要介绍了php跨域和https访问http问题分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

5、nginx代理

如果http服务器无法改成https,或者依旧存在http status=canceled问题,考虑使用nginx代理。

在php代码中把返回的资源地址中的域名替换成当前服务器的域名

/**
 * 替换JAVA地址为本地地址
 * @param $string
 */
function changeJava2Proxy(&$string){
    $finds = [
        'http://xxx.com/file/file/download/image',
        'https://xxx.com/file/file/download/image'
    ];
    $replace = [
        'http://localhost.com/file/file/download/image',
        'http://localhost.com/file/file/download/image'
    ];
    // json格式字符串需要把 / 改成\/
    foreach ($finds as &$find){
        $find = addcslashes($find,'/');
    }
    foreach ($replace as &$find){
        $find = addcslashes($find,'/');
    }

    $string = str_replace($finds, $replace, $string);

}

目标地址
    http://xxx.com/file/file/download/image?filePath=group1/M06/00/B4/rBAylWYg11KAF3sxAA5-gORui7U802.pdf
替换后的地址
    http://aaa.com/file/file/download/image?filePath=group1/M06/00/B4/rBAylWYg11KAF3sxAA5-gORui7U802.pdf

在nginx主机server中添加代理nginx添加代理(生产环境)

​location ~ ^/(file/file/download/image) {
   proxy_pass https://xxx.com;
}

匹配到 /file/file/download/image 开头的地址,会自动跳转到 http://xxx.com 进行处理。

多个匹配规则使用

​location ~ ^/(file/file/download/image|file/file/download/pdf) {
   proxy_pass https://xxx.com;
}

匹配到 /file/file/download/image 和 /file/file/download/pdf 开头的地址。文章来源地址https://www.toymoban.com/news/detail-857967.html

到了这里,关于php跨域和https访问http问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包