在 PHP 中,防止 API 被跨域调用可以通过设置适当的 HTTP 响应头来实现。跨域资源共享(CORS,Cross-Origin Resource Sharing)机制允许或拒绝来自不同源的请求。为了禁止跨域调用,你可以在你的 PHP 脚本中设置 Access-Control-Allow-Origin 头为 null 或者不设置这个头。

下面是一个简单的例子,展示了如何在 PHP 中禁止跨域调用:

<?php
// 设置 HTTP 响应头,禁止跨域调用
header("Access-Control-Allow-Origin: null"); // 你的 API 逻辑
$response = array(
"message" => "API is working, but not allowed to be called from a different origin."
); // 设置响应头为 JSON
header('Content-Type: application/json'); // 输出 JSON 响应
echo json_encode($response);
?>

在这个例子中,header("Access-Control-Allow-Origin: null"); 告诉浏览器这个资源不允许被任何外部源访问。这意味着,只有当请求来自同一个源(即同源策略下的请求)时,才能访问这个 API。

其他方法

1.查 Referer 头‌:
你可以检查 HTTP 请求的 Referer 头来验证请求是否来自一个允许的源。但请注意,Referer 头可以被伪造或省略,所以这不是一个完全可靠的方法。

if (isset($_SERVER['HTTP_REFERER'])) {
$allowed_domain = 'https://yourdomain.com';
if (strpos($_SERVER['HTTP_REFERER'], $allowed_domain) !== 0) {
header('HTTP/1.1 403 Forbidden');
echo json_encode(array("message" => "Access denied."));
exit;
}
} else {
header('HTTP/1.1 403 Forbidden');
echo json_encode(array("message" => "Access denied."));
exit;
} // 你的 API 逻辑

‌2.使用服务器配置‌:
如果你使用的是 Apache 或 Nginx 服务器,你也可以通过服务器配置来限制跨域请求。

(1)Apache‌:

在 .htaccess 文件中添加以下配置:

SetEnvIf Origin "http(s)?://(www\.)?yourdomain\.com(:[0-9]+)?$" ALLOW_ORIGIN
Header set Access-Control-Allow-Origin %{ALLOW_ORIGIN}e env=ALLOW_ORIGIN

(2)Nginx‌:
在 Nginx 配置文件中添加以下配置:

if ($http_origin ~* http(s)?://(www\.)?yourdomain\.com(:[0-9]+)?$) {
add_header 'Access-Control-Allow-Origin' "$http_origin";
}

总结

最简单和直接的方法是通过设置 Access-Control-Allow-Origin 头来禁止跨域调用。然而,根据应用的安全需求,你可能需要结合其他方法,如检查 Referer 头或使用服务器配置,来提供更全面的保护。

【答题系统可参考】php 禁止api被跨域调用的更多相关文章

  1. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

  2. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  3. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  4. 改变mvc web api 支持android ,ios ,ajax等方式跨域调用

    公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 A ...

  5. web api 跨域请求,ajax跨域调用webapi

    1.跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服 ...

  6. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

    思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域 方法:命令行参数启动浏览器后添加参数--disable-web-security 例:chrome --disable-we ...

  7. jQuery跨域调用Web API

    我曾经发表了一篇关于如何开发Web API的博客,链接地址:http://www.cnblogs.com/guwei4037/p/3603818.html.有朋友说开发是会开发了,但不知道怎么调用啊? ...

  8. Web API 解决跨域问题

    一.跨域问题的由来 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容. 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻 ...

  9. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  10. Asp.net Vnext api CORS( 跨域)

    概述 跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的.CORS系统定义了一种浏览器和服务器交互的方式 ...

随机推荐

  1. 探索使用 ViewContainerRef 的 Angular DOM 操控技术

    探索使用 ViewContainerRef 的 Angular DOM 操控技术 https://indepth.dev/posts/1052/exploring-angular-dom-manipu ...

  2. 运筹帷幄,质效兼修:源启云原生基础设施管理平台助推企业IT基础资源能效跃迁

    导语 数字化大潮席卷,企业需要建设一套能够满足云原生环境下基础资源一体化管理和快速交付的基础设施自动化管理系统,系统需要具备"云上""云下""容器&q ...

  3. 【金TECH频道】企业架构转型组合拳来袭,助力金融机构一臂之力

    当前,数字化转型已经成为时代共性课题在政策和技术的双重指引下金融机构逐渐走向差异化竞争的格局面对转型阵痛以契合.明晰的战略规划及企业架构调整来辅助业务变革成为助力企业数字化转型的有效路径金融机构也纷纷 ...

  4. 【C#】【平时作业】习题-6-静态成员

    习题-6静态成员 一.概念题 1. 什么是静态成员 被static修饰的成员,叫做静态成员.静态成员是属于类的.通过类名直接访问. 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当 ...

  5. docker-compose.yml 使用说明

    docker-compose.yml 结构 docker-compose.yml文件分为三个主要部分:services.networks.volumes..services主要用来定义各个容器.net ...

  6. rocketMq4.2.0启动broker报错找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]

    假如弹出提示框提示'错误: 找不到或无法加载主类 xxxxxx'.打开runbroker.cmd,然后将'%CLASSPATH%'加上英文双引号.保存并重新执行start语句.做如下图处理 但是输出还 ...

  7. TheScope, Visibility and Lifetime of Variables

    C language-- TheScope, Visibility and Lifetime of Variables 全局变量 普通全局变量 //file1 #include<stdio.h& ...

  8. 一次 Spring 扫描 @Component 注解修饰的类坑

    问题现象 之前遇到过一个问题,在一个微服务的目录下有相同功能 jar 包的两个不同的版本,其中一个版本里面的类有 @Component 注解,另外一个版本的类里面没有 @Component 注解,且按 ...

  9. Qt音视频开发14-mpv读取和控制

    一.前言 用mpv来读取文件的信息,以及设置当前播放进度,音量.静音等,和当时vlc封装的功能一样,只不过vlc是通过调用函数接口去处理,而mpv是通过读取和设置属性来处理,vlc支持定时器或者线程中 ...

  10. Redis学习笔记之Jedis

    Jedis语法总结 Jedis是Java代码操作Redis的工具包,里面封装了操作Redis的方法 Jedis jedis = new Jedis(String ip , String port) 1 ...