nginx rewrite php的CI(CodeIgniter)框架

一. 了解nginx rewrite:

正则表达式匹配,其中:

* ~ 为区分大小写匹配
    * ~* 为不区分大小写匹配
    * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
    * -d和!-d用来判断是否存在目录
    * -e和!-e用来判断是否存在文件或目录
    * -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
    * break 终止匹配, 不再匹配后面的规则
    * redirect 返回302临时重定向 地址栏会显示跳转后的地址
    * permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全)

$args
    $content_length
    $content_type
    $document_root
    $document_uri
    $host
    $http_user_agent
    $http_cookie
    $limit_rate
    $request_body_file
    $request_method
    $remote_addr
    $remote_port
    $remote_user
    $request_filename
    $request_uri
    $query_string
    $scheme
    $server_protocol
    $server_addr
    $server_name
    $server_port
    $uri

实例:    
1.     文件反盗链并设置过期时间
    这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
    “rewrite ^/ http://http://374400.blog.51cto.com/addblog.jpg;” 显示一张防盗链图片
    “access_log off;”不记录访问日志,减轻压力
    “expires 3d”所有文件3天的浏览器缓存

location ~* ^.+/.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
        valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
        if ($invalid_referer) {
            rewrite ^/ http://374400.blog.51cto.com/addblog.jpg;
            return 412;
            break;
        }
                         access_log   off;
                         root /opt/htdocs/web;
        expires 3d;
        break;
         }

2.     只充许固定ip访问网站,并加上密码
        root  /opt/htdocs/www;
        allow   208.97.167.194;
        allow   222.33.1.2;
        allow   231.152.49.4;
        deny    all;
        auth_basic "C1G_ADMIN";
        auth_basic_user_file htpasswd;

3.     文件和目录不存在的时候重定向:
        if (!-e $request_filename) {
        proxy_pass http://127.0.0.1;
        }

二. nginx location 匹配顺序

location 匹配的原型是这样的:location [=|~|~*|^~|@] /uri/ { … }
    “=”是精确匹配
    “@”是命名的location ,在正常的location 匹配中不会使用,仅仅在内部跳转中才会使用到。
    “~”是区分大小写的匹配
    “~*”是不区分大小写的匹配
    “^~”表示中止正则匹配(这个平时没太注意)

匹配步骤:
    1. 带”=”前缀的先进行匹配,如果找到了,中止查找。
    2. 所有其它location 进行非正则的匹配,找到最精确匹配的那个,如果匹配到带”^~”前缀的,则中止查找。
    3. 正则查找,按照我们配置文件中配置的location 顺序进行查找。
    4. 如果正则查找匹配成功,则使用此正则匹配的location ,否则,使用第二步查找的结果。

这里要特别说明下”=”与”^~”的区别:
    “=”在匹配时,则匹配带”=”的location 。而”^~”,则会匹配所有非”=”的非正则location ,只有在确认它是最精确匹配的location 后,才生效。

三. CI框架伪静态

CI 在 APACHE .htaccess 文件配置
        RewriteEngine on  
        RewriteCond $1 !^(index\.php|system\.php|images|js|swfupload|robots\.txt)  
        RewriteRule ^(.*)$ /wj/index.php/$1 [L]
        注: RewriteRule ^(.*)$ /wj/index.php/$1 [L]里的wj是你的CI程序目录

Nginx服务器伪静态设置首先需要设置nginx开启 path_info,nginx模式默认是不支持path_info模式的

1. pathinfo,一种伪静态的用法,

1.1、让 Apache 支持 PathInfo(Apache 版本 : 2.2.13)
            在配置文件中加入
            <Files *.php>
            AcceptPathInfo On
            </Files>
            这样 Apache 就可以支持针对 php 文件的 PathInfo 了.

1.2、pathinfo 模式 需要 php.ini 开启下面这个参数

cgi.fix_pathinfo=1

path_info模式:http://www.xxx.com/index.php/模块/方法

1.3、让 Nginx 支持 PathInfo

在配置文件里添加

location ~ \.php {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                set $path_info "";
                set $real_script_name $fastcgi_script_name;
                if ($fastcgi_script_name ~ “^(.+?\.php)(/.+)$”) {
                    set $real_script_name $1;
                    set $path_info $2;
                }
            }
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
            include conf/fastcgi.conf;
            }
            要点:
            1.~ \.php 后面不能有$  以便能匹配所有 *.php/* 形式的url
            2. 通过设置更改 SCRIPT_FILENAME

cat fastcgi.conf
                #fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; #注释掉的
                fastcgi_param  QUERY_STRING       $query_string;
                fastcgi_param  REQUEST_METHOD     $request_method;
                fastcgi_param  CONTENT_TYPE       $content_type;
                fastcgi_param  CONTENT_LENGTH     $content_length;

#fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;                #注释掉的
                fastcgi_param  REQUEST_URI        $request_uri;
                fastcgi_param  DOCUMENT_URI       $document_uri;
                fastcgi_param  DOCUMENT_ROOT      $document_root;
                fastcgi_param  SERVER_PROTOCOL    $server_protocol;
                fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
                fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
                fastcgi_param  REMOTE_PORT        $remote_port;
                fastcgi_param  SERVER_ADDR        $server_addr;
                fastcgi_param  SERVER_PORT        $server_port;
                fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
                fastcgi_param  REDIRECT_STATUS    200;

2. CI rewrite 配置
            2.1    
                location / {
                        index  index.php;
                        if (!-e $request_filename) {
                        rewrite  ^/(.*)$  /index.php/$1  last;
                        break;
                        }
                }

2.2
                假设我们的子目录名称为 wj
                        location /wj/ {
                        root   /var/www/html/;
                        index index.html index.htm index.php;
                        if ($request_filename !~* (index\.php|system\.php|images|js|swfupload|robots\.txt)) {
                            rewrite ^/(.*)$ /index.php?$1 last;
                        }

另外附上主目录伪静态规则
                    #rewrite ^/$ /index.php last;
                    #一下是防止某些文件夹被直接访问
                    #rewrite ^/(?!index\.php|images|robots\.txt|js|css|upimg|artDialog|style)(.*)$ /index.php/$1 last;

时间: 12-13

nginx rewrite php的CI(CodeIgniter)框架的相关文章

CI(CodeIgniter)框架中的增删改查操作

我们创建一个模型( 项目目录/models/),请注意:模型名与文件名相同且必须继承数据核心类CI_Model,同时重载父类中的构造方法 CodeIgniter的数据函数类在 \models\User_model.php 连接数据库:$this->load->database(); class User_model extends CI_Model{ public function __construct(){ parent::__construct(); $this->load->

CodeIgniter框架——nginx下的配置

odeigniter(CI)是一个轻量型的PHP优秀框架,但是它是在apache服务器下开发的,在nginx下需要特别的配置才可以使用. 对nginx的配置如下: 1 server { 2 listen 80 default_server; 3 listen [::]:80 default_server ipv6only=on; 4 5 root /home/mqx/openflow/openflow/openflow/web; 6 index index.html index.htm inde

CodeIgniter框架——CI的执行流程

应用程序流程图 CodeIgniter执行流程 源码分析——CI到底做了些什么 (由welcome的例子出发——讲解index.php——讲解CodeIgniter.php) (load_class的具体工作.ConFig类的作用.Loader类的作用.Router解析请求.Controller类的具体工作) CodeIgniter框架--CI的执行流程,布布扣,bubuko.com

[CI] 使用CodeIgniter框架搭建RESTful API服务

在2011年8月的时候,我写了一篇博客<使用CodeIgniter框架搭建RESTful API服务>,介绍了RESTful的设计概念,以及使用CodeIgniter框架实现RESTful API的方法.转眼两年过去了,REST在这两年里有了很大的改进.我对于前一篇博客中的某些方面不是很满意,所以希望能利用这次机会写一个更加完善的版本.我的项目基于Phil Sturgeon的CodeIgniter REST Server,遵循他自己的DBAD协议.Phil的这个项目很棒,干净利落,简单实用,并

CodeIgniter框架中关于URL(index.php)的那些事

最近,在做自己的个人网站时,采用了轻量级的php框架CodeIgniter.乍一看上去,代码清晰简洁,MVC模型非常容易维护.开发时我采用的工具是Netbeans IDE 8.0,当然,本文的内容和开发工具是没有关系的,和我们最后网站采用的服务器有很大的关系.目前最为常用的两款免费web服务器是Apache和Nginx(这两款服务器的比较,可以参考一篇网上的经典文章:http://zyan.cc/nginx_php_v6/).在我网站开发与上线的过程中,刚好两个服务器都用到了,他们配置CodeI

CodeIgniter框架——知识点汇总

NO1.学习要点: 一.CodeIgniter 框架的简介 二.CodeIgniter 框架的安装 三.CodeIgniter 框架的目录结构分析 四.CodeIgniter 框架是如何工作的? 五.CodeIgniter 框架中的控制器.视图.模型及数据库操作 六.CodeIgniter 框架中辅助函数.类库.适配器的学习 七.…… NO2. 一.CodeIgniter 是什么? 1.CodeIgniter 是一个应用程序框架 CodeIgniter 是一个为用 PHP 编写网络应用程序的人员

nginx——rewrite模块

1.什么是Nginx的Rewrite规则? Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressions)Perl兼容正则表达式的语法进行规则匹配,如果 您需要Nginx的Rewrite功能,在编译Nginx之前,须要编译安装PCRE库. 通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向及选择配置. (1)一些使用MVC框架的程序只有一个入口,可以通过Rewrite来实现. (

CodeIgniter框架——表单辅助函数总结

首先第一步就是载入辅助函数: $this->load->helper('form'); 函数解析: 1.form_open() 创建一个开始form标签,相对于你的配置文档中的基础URL.允许你添加一些form属性和一些隐藏表单,并且他会基于你的 config.php 文件里设置的编码,自动生成 accept-charset这个属性. 范例: echo form_open('email/send'); 上面的例子会创建一个form提交至你的基础URL加上"email/send&quo

CodeIgniter框架的缓存原理分解

用缓存的目的:(手册上叙述如下,已经写得很清楚了) Codeigniter 支持缓存技术,以达到最快的速度. 尽管CI已经相当高效了,但是网页中的动态内容.主机的内存CPU 和数据库读取速度等因素直接影响了网页的加载速度. 依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了. 如何用: 启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内: $this->output->cache(1); 其中 n