如何实现禁止直接访问供多域名加载的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
相关产品推荐
相关产品推荐

