时间:2021-07-01 10:21:17 帮助过:21人阅读
404错误的原因
原因是默认Nginx不支持pathinfo这种格式,当你浏览器里输入http:\xxx.xxx.com\index.php\pages\home的时候,Nginx会认为你要访问index.php目录下的pages文件夹里的home,所以会报404 not found错误。
解决方法
解决方法肯定是要修改服务器的重定向规则,大概有两种思路,一种是改nginx安装目录里的nginx.conf文件,如果你用了虚拟主机的话就去nginx安装目录下的vhosts下找对应的*.conf更改即可。另外一种思路修改CI目录下的.htaccess文件,参见:http://blog.csdn.net/freshlover/article/details/8977111
本文是第一种思路。在修改之前先来看下原始的conf文件:
{ listen 80; server_name 1.abc.com 2.abc.com; root /a/domains/1.abc.com/public_html; index index.html index.htm index.shtml index.php; error_page 404 /404.html; #Custom rules Start #Custom rules End location = /500.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass unix:/dev/shm/php.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; access_log /a/apps/nginx/logs/1.abc.com.access.log main; } location ~ /\.ht { deny all; } }1234567891011121314151617181920212223242512345678910111213141516171819202122232425
PS:上面为了隐私,我把server_name改为1.abc.com了,这个对应自己的server_name.
下面介绍修改方法,在修改conf前切记将自己的conf,cp为conf.back备份一份。
下面为修改方法:
1,修改php支持pathinfo
再修改conf之前,找到php的php.ini文件(可能在php安装目录的etc目录也可能在lib文件夹下,看自己的配置),搜索:cgi.fix_pathinfo
将注释放开,并置为1:cgi.fix_pathinfo=1
2,修改conf之前有个问题要明确,那就是CI的根目录 是不是web的root目录,如果是的话,如下修改:
只需要增加如下即可:
在location ~ .php$之前增加一段:
if (!-e $request_filename) { rewrite ^.*$ /index.php last; }123123
这个意思是,如果你浏览器里要访问的文件不存在时,会自动路由至web根目录下的index.php进行访问。
当然上面这段话也可以用下面的来代替:
location / { try_files $uri $uri/ /index.php; }123123
完整的配置为:
server{ listen 80; server_name 1.sod90.com app.sod90.com; root /a/domains/1.sod90.com/public_html; index index.html index.htm index.shtml index.php; error_page 404 /404.html; #Custom rules Start #Custom rules End location = /500.html { root /usr/share/nginx/html; } #location / { # try_files $uri $uri/ /index.php; #} if (!-e $request_filename) { rewrite ^.*$ /city52/index.php last; } location ~ \.php$ { fastcgi_pass unix:/dev/shm/php.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; access_log /a/apps/nginx/logs/app.sod90.com.access.log main; } location ~ /\.ht { deny all; } }123456789101112131415161718192021222324252627282930313233123456789101112131415161718192021222324252627282930313233
注意:上面的try_files完全可以代替rewrite,参见链接
除了加这个重定向之外,conf里不需要再加任何奇奇怪怪的东西。
然后检查CI的config文件里以下三个参数:
$config['base_url'] = 'http://1.abc.com/';$config['index_page'] = '';$config['uri_protocol'] = 'REQUEST_URI';123123
这三个参数比较关键,其中第一个是web根目录对应的域名 ,index_page要为”,不要为默认值 ‘index.php’.
经过以上设置就ok了,url地址里不需要写index.php了。
延伸
现在考虑这种情况,如果一个后台,分支持app和web的,有时候用不同的框架也是在所难免。把所有框架都放在根目录下也不太好看。如果我的CI的根目录不是web的根目录,而是如public_html下的xxx文件夹,此时只需将conf里的try_files语句里路由的/index.php改为/xxx/index.php即可。如下:
location / { try_files $uri $uri/ /xxx/index.php; }123123
再CI的config.php里,写成
$config['base_url'] = 'http://1.abc.com/';11
或者:
$config['base_url'] = 'http://app.sod90.com/xxx/';11
都是可以的,只要路由对了,就没问题。但是为了保险起见,base_url如后者比较好,然后url里就不要再带index.php了。两者的区别还体现在当使用CI的函数如base_url()时得到的值将会不一样。参考链接 。
附一个国外比较靠谱点的链接:
http://stackoverflow.com/questions/8182868/nginx-configuration-avoid-codeigniter-rewrite-rules
CI的多目录:http://blog.sina.com.cn/s/blog_6ec2ae900101kbx9.html
补充说明,一般来说conf里如下三句话是关键:
fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;123123
但是我的conf里只用了下面一句:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;