如何阻止 nginx 服务器上的每个人访问其中包含 php 文件的文件夹 {deny:all;},但允许 ajax 调用访问该文件夹中的文件?

如何阻止 nginx 服务器上的每个人访问其中包含 php 文件的文件夹 {deny:all;},但允许 ajax 调用访问该文件夹中的文件?

我有页眉、页脚和其他处理/include/文件夹中的 ajax 请求的 php 文件。

对于静态网站,用于设置 nginx 默认文件为

location ^~ /include/ { deny all; }

当有人去的时候www.mysite.com/include/header.php它返回403 Forbidden

但是现在,由于我使用 jquery ajax 调用文件/include/夹内的文件,如果我设置这个 =>

location ^~ /include/ { deny all; },没有像保存或报告这样的 ajax 功能。

有没有什么办法可以拒绝访问里面的文件文件/include/其他所有人但要做到这一点仅对 webroot 文件可访问

我尝试过这些:

location ^~ /include/ { allow 127.0.0.1; deny all; }但那不起作用。

location ^~ /include/ { allow <my server's ip>; deny all; }但那不起作用。

我已将 ssh 端口从 22 更改为 123;我应该输入:

location ^~ /include/ { allow 127.0.0.1:123; deny all; }反而?


请参阅以下教程来停止热链接:http://www.nginxtips.com/how-to-stop-image-hotlinking-on-nginx/

据此:我尝试过,

location ~ .(gif|png|jpe?g)$ {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
     return   403;
    }
}

防止图片被热链接(我猜没起作用)以及

location /include/ {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
     return   403;
    }
}

以防止访问该/include/文件夹。

这些都不起作用,是的,我把 mysite 替换成了我网站的真实名称

我也尝试过这样做:

 location ^~ /include/ {
         valid_referers none blocked mysite.com *.mysite.com;
         if ($invalid_referer) {
         return   403;
        }
    }

但是,在这种情况下,添加^~会导致页面@ www.mysite.com/include/header.php‘header.php’被下载;在浏览器中访问它时。

我没有使用任何 CMS,只是使用带有 css 和 js 的纯 php 文件,包括 bootstap 的。(nginx 1.4.6、mysql、php5-fpm 堆栈)

非常感谢您的任何建议。

答案1

发出 AJAX 调用的不是服务器,而是客户端的浏览器,因此仅允许服务器访问该文件夹并不能实现您期望的效果。

我的建议是将所有通过 AJAX 调用的文件移动到一个单独的文件夹(/ajax也许)并保留您为该文件夹配置的内容include

理论上,里面的文件/include不应该被浏览器直接调用,但很可能被脚本语言包含(想象一下!)。这就是为什么 AJAX 请求的文件应该放在自己的文件夹中。

另外,您可以将 AJAX 请求重写到/include文件夹,但我不确定是否deny适用于这种情况。

答案2

您可以根据大多数 Javascript 框架添加到其 AJAX 请求的标头来允许访问,但请注意,任何人都可以伪造这样的请求 - 您无法确定它确实是来自您的 web 应用程序的 AJAX 请求,而不是某人手动、使用或类似方式X-Requested-With: XMLHttpRequest复制 AJAX 请求。curl

相关内容