问题:代码在本地写好之后,传到服务器,首页能正常加载,但无法加载任何控制器,无法加载其他页面。
nginx 的错误代码为 404 not found。
问题举例:我之前做的是自己的一个博客
能够直接访问 http://blog.jianghang.name 也能够通过 http://blog.jianghang.name/Index/Index/index 进行访问;
但 通过http://blog.jianghang.name/index.php/Index/Index/index 就无法访问了,错误提示是无法加载index.php模块。
造成这个错误的原因,可能是有的低版本的nginx不支持path_info(总感觉这个原因有点说不过去,还请高手指出)。解决方法就是重写URL,隐藏 URL中的 index.php。
1.开启ThinkPHP路由模式
在ThinkPHP的配置文件conf.php中加入
‘URL_MODEL’ => 2,
默认情况下 URL_MODEL 为 1,默认情况下使用PATHINFO模式。0为普通模式,采用传统的URL传参模式。2为rewrite模式,重写URL时必须设置为rewrite。3为兼容模式,是传统传参和PATHINFO的结合。
2.在nginx配置文件中重写URL
参考TinkPHP手册,将下面的代码加到 xxxxx.conf 中。xxxx.conf是你的项目的nginx配置文件。
location / {
// …..省略部分代码
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
如果项目文件是在二级目录的话,就得改一下路径。代码如下,yourdomin是二级目录的名字
location /youdomin/ {
// …..省略部分代码
if (!-e $request_filename) {
rewrite ^/yourdomin/(.*)$ /index.php?s=$1 last;
}
}
然后重启nginx。不出意外问题就解决了。
3.something else
除了可以参考手册进行URL重写,也可以自己写规则隐藏index.php。但还是首先推荐参考手册,因为自己写的话,如果是新手可能会出现一些问题。隐藏index.php的代码比如:
location / {
//...省略部分代码
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
提示:千万不能只rewrite而不设置路由,我之前就是因为没有设置路白白浪费了很多时间。