2015-08-28 84 views
0

我有點羞愧打擾你這麼簡單的問題,但我不明白爲什麼配置nginx沒有強制執行一個子文件夾的簡單拒絕規則,真的希望你能推我到明顯的錯誤。nginx簡單否認規則不強制

所以,設置:我有一個nginx網絡服務器運行,/var/www是根目錄,並有一些子文件夾。 SSL是強制執行的,因爲我使用的是來自相應文檔的fastcgi源的設置,因爲我使用的是貝卡CalDAV/CardDAV。這是當前工作的配置文件:

server { 

     listen 443 ssl; 
     root /var/www; 
     index index.html index.htm index.php; 
     server_name mydomain.org; 
     ssl_certificate /path/to/nginx.crt; 
     ssl_certificate_key /path/to/nginx.key; 

     location /doc/ { 
       alias /usr/share/doc/; 
       autoindex on; 
       allow 127.0.0.1; 
       allow ::1; 
       deny all; 
     } 

     location ~ ^(.+\.php)(.*)$ { 
       try_files $fastcgi_script_name =404; 
       fastcgi_split_path_info ^(.+\.php)(.*)$; 
       fastcgi_pass 127.0.0.1:9000; 
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
       fastcgi_param PATH_INFO  $fastcgi_path_info; 
       include   /etc/nginx/fastcgi_params; 
     } 

     rewrite ^/.well-known/caldav /baikal/cal.php redirect; 
     rewrite ^/.well-known/carddav /baikal/card.php redirect; 

     charset utf-8; 
     location ~ /(\.ht|Core|Specific) { 
       deny all; 
       return 404; 
     } 

} 

現在,我只是想限制訪問一個名爲/my/data/ subsubfolder這是我第一次在否認塊加入這樣的:

 location ~ /(\.ht|Core|Specific|my/data/) { 
       deny all; 
       return 404; 
     } 

但這並沒有工作了,所以我定義了自己的位置,如:

 location ~ /my/data { 
       deny all; 
       return 404; 
     } 

嘗試使用和不使用斜線,有和沒有~/doc/以及將任何其他位置塊之前的拒絕位置塊,現在我處於虧損狀態。訪問/my/data和所有子文件夾和文件仍然被授予。誰能幫我嗎?

感謝您的閱讀!

回答

1

如果您使用具有正則表達式的位置,則位置順序非常重要,因爲按順序檢查了正則表達式給出的位置,並且首先匹配了勝利。也就是說,這樣的配置:

location ~ \.php$ { fastcgi_pass ... } 
location ~ /my/data { deny all; } 

將始終允許訪問任何.php文件,甚至匹配/my/data。爲了解決這個問題,你必須保持適當的位置順序,即保持location ~ /my/data第一:

location ~ \.php$ { fastcgi_pass ... } 
location ~ /my/data { deny all; } 

或者,更好的是,與^~修改,而不是使用前綴的位置 - 在這種情況下,爲了不會是很重要的。這也確保了將使用正確的前綴匹配,並且正則表達式根本不會被檢查。例如:

location ~ \.php$ { fastcgi_pass ... } 
location ^~ /my/data { deny all; } 

請參閱http://nginx.org/r/location關於nginx位置匹配的更多細節。

注意,如果您使用deny all,則配置中的return 404是多餘的,反之亦然。只需使用其中一個指令即可。

重要的是要指出,測試時,你不應該依賴你的瀏覽器。使用瀏覽器進行測試通常會導致緩存導致混淆結果。最好使用curl

+0

謝謝你的有益的意見!我清理了整個配置文件並重新排序了位置。最後,我使用'^〜'修飾符,一切正常。感謝您的熱心幫助!! – coroner