You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现禁止直接访问供多域名加载的style.php文件且不影响跨站调用

解决方案:通过style.php自身判断请求上下文实现访问控制

当然可以!我们不需要修改.htaccess,直接在style.php里通过检查HTTP请求头,就能区分「用户直接访问」和「被页面作为样式表调用」的场景,完美解决你的需求。

核心思路

浏览器在不同场景下发送的请求头有明显差异:

  • 用户直接访问:Accept头以text/html为主,且Referer为空(或等于当前style.php的URL)
  • 作为样式表被加载:Accept头会包含text/css,且Referer是调用该文件的页面URL(比如网站1的首页、网站2的任意页面)

我们可以结合这两个请求头来做判断,同时兼容网站1自身的调用场景。

完整的style.php代码实现

<?php
// 先设置正确的CSS内容类型,确保浏览器识别
header('Content-Type: text/css');

// 定义网站1的域名,用于允许自身页面调用
$allowedSelfDomain = 'website1.com';

// 获取请求头信息
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$accept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '';

// 判断请求是否合法
$isValidRequest = false;
if (str_contains($accept, 'text/css')) {
    // 情况1:网站1自身页面调用(Referer包含自身域名)
    if (!empty($referer) && str_contains($referer, $allowedSelfDomain)) {
        $isValidRequest = true;
    }
    // 情况2:其他网站通过<link>标签调用(Referer不为空且不是直接访问style.php)
    elseif (!empty($referer) && !str_ends_with($referer, '/style.php')) {
        $isValidRequest = true;
    }
}

// 如果是无效请求(用户直接访问),输出空内容或返回403
if (!$isValidRequest) {
    // 可选:返回403禁止访问状态码
    // header('HTTP/1.1 403 Forbidden');
    exit('');
}

// ---------------------- 以下是你的核心CSS内容 ----------------------
?>
/* 这里写入你的CSS样式 */
body {
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
}
/* 其他样式代码... */

关键细节说明

  • Content-Type设置:必须先设置text/css,确保浏览器始终将该文件识别为样式表,即使后续输出空内容也不会触发页面错误。
  • Accept头检查:这是判断是否为样式表请求的核心依据,比Referer更可靠(部分浏览器可能因隐私设置禁用Referer)。
  • 网站1自身兼容:通过检查Referer包含自身域名,确保网站1用相对路径调用时能正常加载样式。
  • 直接访问拦截:当用户直接打开https://website1.com/style.php时,Accept头不包含text/css,或Referer为空/指向自身,会被判定为无效请求,输出空内容。

额外优化建议

如果需要限制仅允许指定网站(比如网站2、3)加载,可以添加域名白名单:

$allowedDomains = ['website1.com', 'website2.com', 'website3.com'];
foreach ($allowedDomains as $domain) {
    if (str_contains($referer, $domain)) {
        $isValidRequest = true;
        break;
    }
}

若担心Referer被伪造,还可以结合简单的密钥验证(比如在调用URL后加?key=your_secret_key,在style.php里检查密钥是否匹配),不过普通场景下上述方案已经足够应对需求。

内容的提问来源于stack exchange,提问作者DingRealT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:37:43