问题一(404 错误):
CI/TP 框架写的项目本地(WAMP)环境下运行没问题,将它上传到(LNMP)服务器时:
使用 xxx.com/index.php/home/index/ 就报 404 错误,
通过 xxx.com/index.php?c=home&m=index 能正常访问。
同样的,使用 xxx.com/index.php/ 访问也是一样,在 index.php 后多加一条 “/” 之后就无法解析了。
分析:
看 nginx 配置,其中正则解析 PHP 的这段代码:
# 配置Nginx通过fastcgi方式处理PHP请求
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
可见,Nginx 在遇到 xxx.php 结尾的 URI 才会将请求交给 fastcgi 处理!否则因为正则匹配不到路径导致 404 报错。
解决:
原配置修改为:
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 要开启 phpinfo 模式
# 即去掉 php.ini 中 ;cgi.fix_pathinfo=1 的注释
fastcgi_param PATH_INFO $1;
include fastcgi_params;
}
并且!在 php.ini 中找到
;cgi.fix_pathinfo=1
去掉注释 ;
cgi.fix_pathinfo=1
这个过程,其实就只是开启 pathinfo 模式而已!
问题二(admin.php 模块不存在):
利用Nginx 重写规则,开启隐藏 index.php 之后:
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
使用 xxx.com/admin.php/system/publics/index 就会抛出异常:模块不存在:admin.php
分析:
实际上访问的路径是:xxx.com/index.php/admin.php/system/publics/index
解决:
利用Nginx 重写规则如下:
if (!-e $request_filename) {
rewrite /admin.php(.*)$ /admin.php$1 last;
rewrite ^(.*)$ /index.php/$1;
break;
}
如果访问的后台入口文件就交给admin.php这个入口文件进行处理。其他情况交给index.php这个入口文件。