关于nginx与php fastcgi配置中的SCRIPT_FILENAME
配置过nginx服务器的童鞋肯定很熟悉下面这个配置,这表示如果请求的是php文件,那么把请求交给fastcgi处理(即php-fpm):
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
其中我要说的是下面这个配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
你可以打开fastcgi_params
文件看看,里面是的配置项是不是跟上面这句格式一模一样?
所以,为什么所有人都不把上面这句设置SCRIPT_FILENAME
的配置加到fastcgi_params
里面呢?他们的格式都长的一样,为什么不放进去?而要单独拿出来?
我简单说一下原因:因为历史原因,一开始SCRIPT_FILENAME是这么配置的(也主是说document_root部分是直接写死的,所以这一句才会放在fastcgi_params文件的外面):
fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name;
但是后来有了$document_root
这个变量,不需要直接写死document_root了,所以人们就直接把之前写死的部分直接改成$document_root
,也就是本文开头那种写法,这也是我们目前常见的一种写法,既然这样,为什么官方配置不直接往fastcgi_params添加这一句,而是我要们自己写呢?原因是怕大家都这样用习惯了,如果在fastcgi_params里添加了这一句,但很多人不知道,还是在外面又自己加一句,这样一来就重复了,就会出问题,所以官方并没有在fastcgi_params文件里直接加这句,而是采用了增加一个新文件的做法,这个新文件叫fastcgi.conf
,该文件与fastcgi_params
几乎完全一样,只是增加了前面说的定义SCRIPT_FILENAME的那句配置,然后再推荐大家用这个配置文件,所以实际上我们可以写成这样:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}
但由于长久以来各种资料文档一直都用本文开头那种写法,而且很多人其实并不太清楚这个的具体含义直接粘贴来用的,所以这就是为什么不把定义SCRIPT_FILENAME
的配置项放入fastcgi_params
文件中的原因,因为fastcgi_params
其实是被抛弃了的。
另外,fastcgi.conf里的这句:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
其实可以写成(我目前就是这么写的):
fastcgi_param SCRIPT_FILENAME $request_filename;
原因,有可能是$request_filename
变量是后来才有的吧。
关于fastcgi_params与fastcgi.conf文件的区别原文,请看fastcgi_params versus fastcgi.conf – nginx config history