文中提到,利用lnmp1.1搭建的nginx情況,正好我的vps也是lnmp搭建的情況,所以我可以在我的vps里做嘗試。
看到文中的辦理方案:
在location中,將匹配到/(avatar|uploads|ups)/.*.(php|php5)?$的請(qǐng)求全部禁用掉。
好像是一個(gè)很好的要領(lǐng),那我們?cè)趺蠢@過?
在web世界里,有一種請(qǐng)求方法叫pathinfo,我們?cè)趫D中也可以看到,倒數(shù)第二行注釋掉了一個(gè)include pathinfo.conf。前面的說明里也說到了,假如要開啟pathinfo,只要注釋掉try_files $uri =404即可。
許多框架、CMS的默認(rèn)請(qǐng)求方法就是pathinfo,如著名php框架codeigniter,所以可見pathinfo用的是較量廣的,所以也會(huì)有大量vps在這里是答允pathinfo的。
那么,當(dāng)開啟了pathinfo后,前面的deny all;就完全失效了,我們只需要在upload目次里上傳xxx.php后,如下方法會(huì)見:
http://xxx/upload/xxx.php/xxx
即可讓location /(avatar|uploads|ups)/.*.(php|php5)?$這條法則完全失效,因?yàn)樯鲜稣?qǐng)求并不以.php末了。
那么,奈何才氣有效克制某目次下理會(huì)php?
那照舊應(yīng)該回到nginx理會(huì)php的方法上。我們看到上圖,我們可以發(fā)明,實(shí)際長(zhǎng)進(jìn)入這個(gè)location塊:location ~ [^/].php(/|$),才真正將請(qǐng)求交給fastcgi去理會(huì)。
所以,我們只需要阻止請(qǐng)求進(jìn)入這個(gè)location塊,那么這個(gè)請(qǐng)求豈論是奈何的后綴,奈何的方法,都不會(huì)被php-fpm理會(huì)的。
所以,我的要領(lǐng)是:
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的理會(huì)塊前,加上“l(fā)ocation ^~ /upload/ ”塊,,^~的意思是“一旦匹配上該塊,則不再匹配其他塊,一般匹配目次”。所以,這里正好滿意我的要求,只要在/upload/目次下的文件,都將匹配到這個(gè)塊中,并且不會(huì)再匹配此外塊,所以也不會(huì)再進(jìn)入下面的php理會(huì)塊中。