Nginx

拒絕 Nginx 中的文件夾導致 PHP-FPM 不優先

  • September 25, 2016

標題說明了一切,但我有一個非常有趣的問題,我很困惑。基本上,我有一個簡單的 WordPress 安裝,我希望拒絕一個文件夾(以及文件夾中的所有文件),比如說 /wp-content/themes/default/scripts 但允許某些 IP。

我可以拒絕這個文件夾的位置,^~/wp-content/themes/default/scripts {deny all;}就像任何 Nginx 大師會告訴你的那樣。

但據我了解,“^”優先級更高,一旦找到正則表達式匹配,它將停止搜尋其他位置塊。因為我不想拒絕所有人的文件夾(當然,使用allow (IP Address);,我的^~/wp-content/...位置塊完全抽出我的 PHP-FPM 位置塊以將文件傳遞給 FastCGI 伺服器。當然,當我嘗試查看任何文件時在該文件夾中,PHP 文件是直接下載的,因為 PHP 不對其進行解析。

有人有想法嗎?我想阻止該文件夾,但要讓 PHP 同時為我決定允許的使用者工作。這是一個相當棘手的問題。我找不到問題的任何答案。

多謝你們!非常感謝您的幫助!

對於任何想知道的人,我目前的 Nginx 虛擬主機配置如下所示:

server {
   #..all of the common stuff you would expect

   include /folder/nginx.conf; #including some WordPress rewrites for W3 Total Cache

   # pass the PHP scripts to FastCGI server listening on UNIX socket
   location ~ \.php$ {
       fastcgi_pass   127.0.0.1:9000;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include /etc/nginx/fastcgi_params;
       fastcgi_read_timeout 1900;
   }

   location / {
       #allowing some IPs...

       #deny everyone else
       deny all;

       #WordPress rewrite for slugs
       index index.php;
       if (!-e $request_filename) {
           rewrite ^(.*)$  /index.php last;
       }

       #rewrite for sitemaps
       rewrite ^(.*/)?sitemap.xml /wp-content/sitemap.php last;

   }

   # denying access to .htaccess files
   location ~ /\.ht {
           deny  all;
   }
}

終於找到了答案。當你做這樣的事情時,你需要重新聲明 PHP-FPM 設置(location ~ \.php$ { (this code) }塊中的所有東西。

因此,為了避免冗餘,我將這些值放在另一個文件中,並留下如下內容:

server {

       # pass the PHP scripts to FastCGI server listening on UNIX socket
       location ~ \.php$ {
               include /etc/nginx/fastcgi_php_text;
       }

       location / {
               index index.php;
       }

       location ^~/folder/ {
               deny all;
               allow ...;

               include /etc/nginx/fastcgi_php_text;
       }
}

不知道這是否是最好的方法,但這是我想出的唯一方法。

引用自:https://serverfault.com/questions/359169