如何阻止 nginx 伺服器上的所有人 {deny:all;} 存取包含 php 檔案的資料夾,但允許 ajax 呼叫存取該資料夾中的檔案?

如何阻止 nginx 伺服器上的所有人 {deny:all;} 存取包含 php 檔案的資料夾,但允許 ajax 呼叫存取該資料夾中的檔案?

我的頁首、頁尾和其他處理 ajax 請求的 php 檔案都在/include/資料夾中。

對於靜態網站,用於將 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;
        }
    }

但是,在這種情況下,添加^~導致頁面@ 'header.php'被下載;www.mysite.com/include/header.php在瀏覽器中訪問它時。

我沒有使用任何 CMS,只是使用 css 和 js 的普通 php 文件,包括 bootstap 的文件。 (nginx 1.4.6、mysql、php5-fpm 堆疊)

非常感謝任何建議。

答案1

伺服器不是進行 AJAX 呼叫的伺服器,而是客戶端的瀏覽器,因此僅允許伺服器存取該資料夾不會執行您期望的操作。

我的建議是將透過 AJAX 呼叫的所有檔案移至一個單獨的資料夾(/ajax也許),並保留您為該include資料夾配置的內容。

理論上,其中的檔案/include不應該被瀏覽器直接調用,但很可能被腳本語言包含(想像一下!)。這就是為什麼 AJAX 請求的檔案應該放在它們自己的資料夾中。

作為替代方案,您可以重寫對/include資料夾的 AJAX 請求,但我不確定這是否deny適用於這種情況。

答案2

您可以根據X-Requested-With: XMLHttpRequest大多數Javascript 框架添加到其AJAX 請求中的標頭來允許訪問,但請注意,任何人都可以偽造此類請求- 您無法確定它確實是來自您的Web 應用程式的AJAX 請求,而不是複製該AJAX 請求的人手動、使用curl或類似方式。

相關內容