Yaf:nginx重寫規則

try_files $uri $uri/ /index.php$is_args$args;



將這行代碼放在server{}塊裏面便可。

解釋一下含義: php

首先是nginx的try_files指令,當一個請求發生時,好比"/abc",它會檢查"/abc"($uri)文件是否存在以及"/abc/"($uri/)目錄是否存在,若是不存在,則重定向到最後一個參數"/index.php$is_args$args". css

咱們知道index.php是框架的"入口文件"。 html

而$args是nginx內置變量,表明url中的query字符串,也就是get參數啦,像"a=1&b=2&c=3"。 nginx

$is_args取決於$args,用三元一次表達式表示:$is_args = empty($args)?'':'?'; shell

 這樣一來,假設幾個url,看看是如何重定向的: apache

/index/index  => /index.php 瀏覽器

/admin/index?id=1  => /index.php?id=1 框架

很奇怪是嗎,重定向之後,路徑都消失了,那麼框架內部又如何路由呢? url

答案是$_SERVER['REQUEST_URI'](這裏並非惟一途徑,框架還會考慮PATH_INFO以及IIS下有特殊處理,可是咱們nginx和apache只要有request_uri就能夠了),只須要知道一點:雖然nginx內部重定向了,可是REQUEST_URI參數是沒有改變的,它表明的是原始的url,也就是瀏覽器地址欄中的url。 spa

上面兩個重定向發生後,實際上:

$_SERVER['REQUEST_URI']="/index/index";

$_SERVER['REQUEST_URI']="/admin/index?id=1";

以後框架會根據$_SERVER['REQUEST_URI']來路由解析。

最後附上我本身的一個配置:

server
{
                listen       80;
                server_name 你本身的域名;
                index index.html index.htm index.php;
                root  /home/wwwroot/yaf;
                try_files $uri $uri/ /index.php$is_args$args;


                location ~ .*\.(php|php5)?$
                        {

                                fastcgi_pass  unix:/tmp/php-cgi.sock;
                                fastcgi_index index.php;
                                include fcgi.conf;
                        }

                location /status {
                        stub_status on;
                        access_log   off;
                }

                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
                        {
                                expires      30d;
                        }

                location ~ .*\.(js|css)?$
                        {
                                expires      12h;
                        }

                access_log  /home/wwwlogs/access.log  access;
}
相關文章
相關標籤/搜索