У меня простой 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
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
Заголовок HTTP-запроса при создании XMLHttpRequest.
(Нет необходимости в L
флаг в дополнение к F
.)