拒绝直接访问文件但允许从 index.html 访问

拒绝直接访问文件但允许从 index.html 访问

我有一个简单的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。)

相关内容