如何通过.htaccess配置禁止用户访问JSON文件仅允许站点AJAX调用?
JSON文件防盗用配置失效问题解决方案
原有配置失效原因
- 你之前配置的
allow from localhost规则,仅允许服务器自身的IP直接访问该JSON文件,但站点页面发起的AJAX请求是访问者的浏览器客户端发起的,请求来源是用户的公网IP,不属于服务器本机IP,自然会被规则拦截,导致自身站点的AJAX也无法正常加载数据。 - 需要先明确一个基础逻辑:只要是前端AJAX可以正常获取的资源,用户理论上都可以通过浏览器开发者工具抓包获取,不存在100%完全杜绝用户拿到资源的方案,只能通过多层防护大幅提升盗用成本,以下是可落地的实现方式。
推荐实现方案(防护强度最高)
不要把JSON作为静态文件放在Web可直接访问的目录下,改用后端接口动态输出:
- 将原有的
.json文件移动到网站根目录之外的非Web访问路径,例如Linux服务器下的/opt/private_data/目录,外部用户根本无法通过URL直接定位请求到该文件。 - 编写一个后端接口(例如路由地址为
/api/fetch_config),接口逻辑为服务端直接读取上述私有目录下的JSON文件内容,再返回给前端请求。 - 给接口增加多层校验规则提升盗用成本:
- 校验请求的
Referer头,仅放行来自你自身域名的请求,该规则可以拦截普通用户直接输入地址访问、低阶站点盗用的情况 - 增加时效签名校验:页面渲染时由服务端生成一个有效期5-10分钟的随机token存入会话,前端发起AJAX请求时必须携带该token,服务端校验token合法才返回JSON内容,token过期自动失效,可大幅提升批量爬取盗用的成本
- 增加IP请求频率限制,单IP短时间内请求次数超过阈值就直接拦截
- 校验请求的
备选方案(保留静态JSON文件的Apache配置)
如果你不想改动现有逻辑,一定要保留静态JSON文件的访问方式,可以替换原有.htaccess规则为基于Referer校验的配置,注意该规则防护强度弱于后端接口方案,Referer头可以被技术手段伪造:
<Files "你的目标json文件名称.json"> Order Deny,Allow Deny from all # 匹配自身域名的Referer才放行,记得替换为你自己的域名 SetEnvIf Referer "https?://(www\.)?your-domain.com/" allowed_request Allow from env=allowed_request </Files>
该配置生效后,用户直接在浏览器地址栏输入JSON文件URL访问时,通常不会携带对应站点的Referer头,会被直接拦截;从你自己站点页面发起的AJAX请求会自动携带当前站点的Referer,可以正常访问。
重要提醒:不要在这类前端可获取的JSON文件中存放敏感信息,包括但不限于接口密钥、用户隐私数据、后台权限凭证,这类敏感数据必须存储在服务端,绝对不能输出到前端。
内容的提问来源于stack exchange,提问作者Jonas Anton
相关产品推荐
相关产品推荐

