Apache 上的项目部署到 Nginx 后出现的问题及解决方法(404 错误、admin.php 模块不存在等)

问题一(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这个入口文件。

发布了46 篇原创文章 · 获赞 42 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Phplayers/article/details/95487098