使用CodeIgniter开发所遇到的问题

加入全栈技术交流群(QQ群号:254842154)

CodeIgniter与Apache搭配

与apache搭配时,需要在站点根目录新建一个.htaccess文件,内容如下:

RewriteEngine on
RewriteCond $1 !^(index\.php|resource|robots\.txt)
RewriteRule ^(.*)$ ./index.php/$1 [QSA,PT,L]

另外,需要在httpd.conf中的 <Directory "/var/www/html"> 节点把 AllowOverride 的值修改为 All。假如配置了vhost,也要在vhost中把AllowOverride 的值修改为 All。这一点很关键。

CodeIgniter与nginx搭配

CodeIgniter与nginx配合时,经常会遇到这两个错误提示:

File not found No input file specified

这个错误跟path_info有关,需要在nginx中对应的站点配置中做简单配置。下面我把我的一个站点配置贴出来供参考:

server {
    listen      80;
    server_name services.xx.com;
    server_name_in_redirect  off;

    root /data/web/xx/services;
    index index.php index.htm index.html;

    error_log  /data/log/xx/web_common/error.log ;
    access_log /data/log/xx/web_common/access.log main;

    location / {
         index  index.php index.html;
    }

    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php/$1 last;
        break;
    }

    location ~ .*\.(svn|git|cvs) {
         deny all;
    }

    location ~* \.(htm|html|xml|shtml)$ {
         expires 600;
     }

    location  ~* \.(js|css|htc|gif|ico|png|swf|jpg|jpeg|bmp)$ {
          expires 365d;
     }

    location ~* \.(bak|tar|gz|zip|tgz|sql)$ {
          return 403;
     }

    location ~ .*.php($|/) {
         fastcgi_split_path_info ^(.+\.php)(.*)$;
         fastcgi_param PATH_INFO $fastcgi_path_info;
         include php_fastcgi_params;
         fastcgi_pass  unix:/tmp/php-fpm.sock;
         fastcgi_index index.php;
   }
}

特别注意最后一个配置中的 fastcgi_split_path_infofastcgi_param PATH_INFO 以及 location ~ .*.php($|/)。仔细对比自己的配置和我的配置吧。

对于有子站点的情况,比如我的CI目录结构是这样的:

---- application
    |---- api
    |---- wechat
---- system
---- logs
……

application 目录下放各个子站点,并通过同一个二级域名访问,假设是 apps.xx.com,那么各个子站点的访问链接为:

http://apps.xx.com/api
http://apps.xx.com/wechat

那么,apps这个二级域名对应的配置为:

server {
    listen      80;
    server_name apps.xx.com;
    server_name_in_redirect  off;

    root /data/web/xx/application;
    index index.php index.htm index.html;

    error_log  /data/log/xx/web_common/error.log ;
    access_log /data/log/xx/web_common/access.log main;

    location / {
        index index.php index.html;
    }

    location /api {
       index  index.php index.html;
       if ( !-e $request_filename ) {
           rewrite ^/api/(.+)$ /api/index.php/$1 last;
           break;
       }
    }

    location /wechat {
       index  index.php index.html;
       if ( !-e $request_filename ) {
           rewrite ^/wechat/(.+)$ /wechat/index.php/$1 last;
           break;
       }
    }

    location ~ .*\.(svn|git|cvs) {
         deny all;
    }

    location ~* \.(htm|html|xml|shtml)$ {
        expires 600;
     }

    location  ~* \.(js|css|htc|gif|ico|png|swf|jpg|jpeg|bmp)$ {
          expires 365d;
     }

    location ~* \.(bak|tar|gz|zip|tgz|sql)$ {
         return 403;
     }

     location ~ .*.php($|/) {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include php_fastcgi_params;
        fastcgi_pass  unix:/tmp/php-fpm.sock;
        fastcgi_index index.php;
   }
}

注意各个子站点的配置。

最后,还需要在各个站点的根目录下建立一个.htaccess文件,内容如下。CodeIgniter与Apache搭配时也需要这个重写规则

RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt)
RewriteRule ^(.*)$ ./index.php/$1 [L]

标签: none

→ 如果你觉得作者的文章不错,一不小心帮到了你,欢迎打赏作者几包辣条的钱💰