使用htaccess拒绝ajax文件访问

有一些脚本只能通过ajax使用,我不希望用户直接从浏览器运行这些脚本。 我使用jQuery进行所有ajax调用,并将所有的ajax文件保存在名为ajax的文件夹中。

所以,我希望创build一个htaccess文件来检查ajax请求(HTTP_X_REQUESTED_WITH)并拒绝该文件夹中的所有其他请求。 (我知道,http头可以伪造,但我想不出一个更好的解决scheme)。 我试过这个:

ReWriteCond%{HTTP_X_REQUESTED_WITH} ^ $
ReWriteCond%{SERVER_URL} ^ / ajax / .php $
ReWriteRule ^。* $ – [F]

但是,它不工作。 我做错了什么? 有没有其他办法可以达到类似的结果。 (我不想检查每个脚本中的标题)。

不好:Apache 🙁

X-Requested-With在不是一个标准的HTTP头 。

你不能在apache中读取它(既不是由ReWriteCond %{HTTP_X_REQUESTED_WITH}也不是由%{HTTP:X-Requested-With} ),所以它不可能在.htaccess或相同的地方检查它。 🙁

丑陋的脚本:-(

它只是在脚本(如PHP)访问,但你说你不想在所有的脚本包括一个PHP文件,因为文件的数量。

好:auto_prepend_file 🙂

  • 但是…有一个简单的伎俩来解决它:-)

auto_prepend_file指定在主文件之前自动分析的文件的名称。 您可以使用它来自动包含一个“检查器”脚本。

所以在ajax文件夹中创建一个.htaccess

 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'){在文档的开始,如果没有设置,那么不要返回任何东西。

编辑原因如下: http : //github.com/jquery/jquery/blob/master/src/ajax.js#L370

编辑2我的不好,只是通过您的文章再次阅读。 你也可以让一个文件夹无法访问网络,然后只是有一个标准的ajax.php文件include('./private/scripts.php')因为你的服务器仍然可以访问它,但没有人会能够从浏览器中查看。

使用.htaccess的替代方法是使用$ _SERVER ['HTTP_REFERER']变量来测试脚本是从您的页面访问的,而不是从其他站点访问的。