try_files $uri $uri/ /index.php$is_args$args;
解释一下含义:
首先是nginx的try_files指令,当一个请求发生时,比如"/abc",它会检查"/abc"($uri)文件是否存在以及"/abc/"($uri/)目录是否存在,如果不存在,则重定向到最后一个参数"/index.php$is_args$args".
我们知道index.php是框架的"入口文件"。
而$args是nginx内置变量,代表url中的query字符串,也就是get参数啦,像"a=1&b=2&c=3"。
$is_args取决于$args,用三元一次表达式表示:$is_args = empty($args)?‘‘:‘?‘;
这样一来,假设几个url,看看是如何重定向的:
/index/index => /index.php
/admin/index?id=1 => /index.php?id=1
很奇怪是吗,重定向以后,路径都消失了,那么框架内部又如何路由呢?
答案是$_SERVER[‘REQUEST_URI‘](这里并不是唯一途径,框架还会考虑PATH_INFO以及IIS下有特殊处理,但是我们nginx和apache只要有request_uri就可以了),只需要知道一点:虽然nginx内部重定向了,但是REQUEST_URI参数是没有改变的,它代表的是原始的url,也就是浏览器地址栏中的url。
上面两个重定向发生后,实际上:
$_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; }
原文地址:http://my.oschina.net/cxz001/blog/294361