Есть несколько сценариев, которые я использую только через ajax, и я не хочу, чтобы пользователь запускал эти скрипты непосредственно из браузера. Я использую jQuery для создания всех вызовов ajax, и я сохраняю все свои файлы ajax в папке с именем ajax.
Итак, я надеялся создать файл htaccess, который проверяет запрос ajax (HTTP_X_REQUESTED_WITH) и отказывает все остальные запросы в этой папке. (Я знаю, что http-заголовок можно подделать, но я не могу придумать лучшего решения). Я попробовал это:
ReWriteCond% {HTTP_X_REQUESTED_WITH} ^ $
ReWriteCond% {SERVER_URL} ^ / ajax / .php $
ReWriteRule ^. * $ – [F]
Но это не работает. Что я делаю неправильно? Есть ли другой способ добиться аналогичных результатов. (Я не хочу проверять заголовок в каждом скрипте).
X-Requested-With
в нестандартном HTTP-заголовке .
Вы не можете прочитать его в apache вообще (ни ReWriteCond %{HTTP_X_REQUESTED_WITH}
ни %{HTTP:X-Requested-With}
), поэтому его невозможно проверить в .htaccess или в том же месте. 🙁
Его просто доступно в скрипте (например, php), но вы сказали, что не хотите включать php-файл во все ваши скрипты из-за количества файлов.
auto_prepend_file
указывает имя файла, который автоматически анализируется перед основным файлом. Вы можете использовать его, чтобы автоматически включать скрипт «checker».
Поэтому создайте .htaccess
в папке ajax
php_value auto_prepend_file check.php
и создайте check.php
как вы хотите:
<? if( !@$_SERVER["HTTP_X_REQUESTED_WITH"] ){ header('HTTP/1.1 403 Forbidden'); exit; } ?>
Вы можете настроить его так, как хотите.
Я предполагаю, что у вас есть все ваши скрипты AJAX в каталоге ajax, потому что вы ссылаетесь на ^ / ajax / .php $ в своем нерабочем примере.
В этой папке /ajax/
поместите файл .htaccess
с этим контентом:
SetEnvIfNoCase X-Requested-With XMLHttpRequest ajax Order Deny,Allow Deny from all Allow from env=ajax
То, что это делает, отрицает любой запрос без заголовка XMLHttpRequest.
Существует только несколько предопределенных HTTP_ * переменных, сопоставляемых с заголовками HTTP, которые вы можете использовать в RewriteCond. Для любых других HTTP-заголовков вам нужно использовать переменную% {HTTP: header}.
Просто измените
ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$
Для того, чтобы:
ReWriteCond %{HTTP:X-Requested-With} ^$
Просто проверьте, if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){
в начале документа, если он не установлен, то ничего не возвращайте.
edit Вот почему: http://github.com/jquery/jquery/blob/master/src/ajax.js#L370
edit 2 Мой плохой, просто прочитайте свой пост снова. Вы также можете сделать папку недоступной для Интернета, а затем просто иметь стандартный файл ajax.php, который include('./private/scripts.php')
поскольку ваш сервер все равно сможет получить к нему доступ, но никто не будет возможность просмотра из своего браузера.
Альтернативой использованию .htaccess является использование переменной $ _SERVER ['HTTP_REFERER'] для проверки того, что сценарий выполняется с вашей страницы, а не с другого сайта и т. Д.