文中提到,利用lnmp1.1搭建的nginx情況,正好我的vps也是lnmp搭建的情況,所以我可以在我的vps里做嘗試。
看到文中的辦理方案:
在location中,將匹配到/(avatar|uploads|ups)/.*.(php|php5)?$的請求全部禁用掉。
好像是一個很好的要領,那我們怎么繞過?
在web世界里,有一種請求方法叫pathinfo,我們在圖中也可以看到,倒數第二行注釋掉了一個include pathinfo.conf。前面的說明里也說到了,假如要開啟pathinfo,只要注釋掉try_files $uri =404即可。
許多框架、CMS的默認請求方法就是pathinfo,如著名php框架codeigniter,所以可見pathinfo用的是較量廣的,所以也會有大量vps在這里是答允pathinfo的。
那么,當開啟了pathinfo后,前面的deny all;就完全失效了,我們只需要在upload目次里上傳xxx.php后,如下方法會見:
http://xxx/upload/xxx.php/xxx
即可讓location /(avatar|uploads|ups)/.*.(php|php5)?$這條法則完全失效,因為上述請求并不以.php末了。
那么,奈何才氣有效克制某目次下理會php?
那照舊應該回到nginx理會php的方法上。我們看到上圖,我們可以發明,實際長進入這個location塊:location ~ [^/].php(/|$),才真正將請求交給fastcgi去理會。
所以,我們只需要阻止請求進入這個location塊,那么這個請求豈論是奈何的后綴,奈何的方法,都不會被php-fpm理會的。
所以,我的要領是:
location ^~ /upload/ {
default_type text/plain;
expires 30d;
}
location ~ [^/].php(/|$)
{
# comment try_files
$uri =404; to enable pathinfo
#try_files $uri
=404;
fastcgi_pass unix:/tmp/php-cgi-leavesongs.sock;
fastcgi_index
index.php;
include
fastcgi.conf;
include
pathinfo.conf;
}
在php的理會塊前,加上“location ^~ /upload/ ”塊,,^~的意思是“一旦匹配上該塊,則不再匹配其他塊,一般匹配目次”。所以,這里正好滿意我的要求,只要在/upload/目次下的文件,都將匹配到這個塊中,并且不會再匹配此外塊,所以也不會再進入下面的php理會塊中。