location ~ .php$ {
...
}
然后根的location是:
location / {
try_files $uri $uri/ /index.php # 原本最后一个是/index.html
}
结果就是,/abc/def.php/1/2/3匹配进了location /,然后找不到文件就给改写成了/index.php,然后/index.php不存在于是就显示No input file specified.
把匹配php的location改为:
location ~ .php$|.+.php/.+$ {
...
}
就OK了。
P.S.
1. php.ini里面的cgi.fix_pathinfo要设成0,否则有安全问题。
2. nginx使用fastcgi_split_path_info解决PATH_INFO的问题,把URL拆成两部分再设好变量SCRIPT_FILENAME和PATH_INFO的内容
3. 不清楚fastcgi_index index.php;是干什么用的,按location匹配进来的URL不都是带.php的么。
4. try_files的机制稍微有点怪,Nginx文档里说如果最后一个匹配,会做internal redirect,其他的是internal URI pointer。try_files $uri $uri/ /index.php时,访问/abc/def.php/1/2时会去找/index.php,访问/abc/的时候能找到/abc/index.php(应该是通过$uri/)。如果只写try_files $uri $uri/,访问/abc/的话却跳不到/abc/index.php(location外面已有index index.php),日志里说redirection cycle。如果是try_files $uri $uri/ =404;貌似就正常了。