我有一个简单的SPA,其结构如下:
.htaccess
index.html
router.php
temp ┑
├─ error.tmp
├─ form.tmp
└─ post.tmp
js ──┑
└─ m.js
如何拒绝直接访问模板但允许从 index.html 访问它们?
这种方式没有帮助:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://example.com [NC]
RewriteRule ^temp/(.*)\.tmp$ - [F,L]
ErrorDocument 403 /index.html
ErrorDocument 404 /index.html
答案1
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https://mydomain\.com [NC] RewriteRule ^temp/(.*)\.tmp$ - [F,L]
如果您想拒绝“直接访问”(即当用户直接在浏览器的地址栏中输入 URL 时),则需要删除检查标Referer
头是否为空的第一个条件。对于“直接请求”,标头Referer
始终为空 - 因此上述操作不会阻止它们。
但是,“正常”防盗链保护中存在这种情况的原因是因为客户端可能不会发送一个,Referer
即使需要发送一个。如果没有这个条件然后这些合法的客户端也将被阻止。
允许访问它们
index.html
如果你特别想只允许访问index.html
而不允许其他客户端文件,则更改条件以匹配此条件精确的Referer。例如:
RewriteCond %{HTTP_REFERER} !=https://example.com/index.html
...
fetch()
来自m.js
但是,如果您通过 XMLHttpRequest 获取这些资源(在其中构建整个 HTTP 请求),则无需检查 HTTP Referer(尽管您可以注入标头Referer
)。相反,您可以发送自定义标头,例如X-AJAX
(或者可能覆盖User-Agent
请求中的),然后检查此标头。例如:
RewriteCond %{HTTP:X-AJAX} !yes
RewriteRule ^temp/(.*)\.tmp$ - [F]
X-AJAX: yes
然后在构建 XMLHttpRequest 时设置HTTP 请求标头。
L
(除了 之外,不需要标志F
。)