在 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
头或使用服务器配置,来提供更全面的保护。