使用Cloudflare时如何设置仅允许自有站点iframe访问子域名页面
问题解答
需求实现方案
你的需求完全可以实现,组合使用以下三层规则即可覆盖所有场景:
1. 配置CSP头限制iframe嵌入权限
这是W3C标准专门用于控制页面可被嵌套权限的方案,优先级高于旧的X-Frame-Options头,直接在子域名的Apache配置或者站点根目录.htaccess文件中添加以下规则:
<IfModule mod_headers.c> # 将下方https://你的主域名.com替换为你实际的主站地址 Header set Content-Security-Policy "frame-ancestors 'self' https://你的主域名.com;" </IfModule>
该规则会强制所有浏览器仅允许你的主站iframe嵌套子域名页面,其他站点尝试嵌套时会直接被浏览器拦截。
2. 配置来源校验禁止直接访问/第三方访问
CSP仅限制嵌套行为,无法拦截用户直接输入子域名地址访问、第三方程序爬取的场景,可通过校验请求Referer头实现拦截:
- Cloudflare侧配置(更推荐,边缘拦截节省服务器资源):在Cloudflare控制台自定义规则中新建规则,匹配条件设置为「主机名等于你的游戏子域名 且 Referer不包含你的主域名」,动作选择
阻止,返回状态码403即可。 - Apache侧配置(无需修改Cloudflare时使用):在
.htaccess中添加以下规则:
<IfModule mod_rewrite.c> RewriteEngine On # 替换为你的实际主站地址 RewriteCond %{HTTP_REFERER} !^https://你的主域名.com/.*$ [NC] RewriteRule .* - [F,L] </IfModule>
如果需要避免少部分用户禁用Referer导致的误拦截,可额外加签名校验逻辑:主站生成带有效期和加密签名的子域名访问地址,子域名服务端验证签名合法才返回内容,该方案兼容性和安全性更高。
IP归属与冲突问题说明
用户通过主站的iframe加载子域名页面时,请求是用户浏览器直接向子域名服务器发起的客户端独立请求,主站服务器仅负责返回包含iframe标签的主站页面内容,不会转发子域名的资源请求,因此发起请求的IP是用户的真实IP,不是主站的服务器IP。
如果你直接配置子域名仅允许主站IP访问,会拦截所有普通用户的合法iframe请求,出现严重的访问冲突,该方案不可行。
内容的提问来源于stack exchange,提问作者amreos
相关产品推荐
相关产品推荐

