这个不是很麻烦的事情,毕竟Yii已经做了所有的路由的相关事情,我们只需要配置一下路由规则和nginx就可以了,这里介绍三种nginx配置方案,其实不止Yii,大多数的php框架都可以这样配置
方案一
(这个是网上最多的解决方案,yaf官方推荐的,不多赘余,这里就一笔带过)
if (!-e $request_filename) {
rewrite ^/path/(.*) /path/index.php/$1 last;
}
判断请求的文件是否存在,然后就rewrite给index.php 需要配置nginx的pathinfo的支持这样可能带来一点点效率问题,和安全问题(http://www.laruence.com/2010/05/20/1495.html)
方案二
rewrite参数传递路由
location /sampleapp {
rewrite ^/sampleapp/(.*)$ /sampleapp/index.php?r=$1;
}
这是nginx推荐的yii配置,大家可以移步 http://wiki.nginx.org/Yii
这也是我刚开始最喜欢的配置方式,但却有一个问题
如果你配置yii rule array('login'=>'account/login')
然后访问 http://host/sampleapp/login 却惊奇的发现是一个404,关于这个问题我查看yii代码后,提交了一个pull request https://github.com/yiisoft/yii/pull/3423 以修改此问题 不过没有采纳
所以下面我就要隆重推出方案三了,这个方法会有一些局限,但我认为比较安全的;
方案三
location ~ \.php$ {
deny all;
}
location ^~ /apppath {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/apppath/index.php; }
location ~ ^/apppath/(protected|framework|nbproject){
deny all;
}
location ^~ /apppath/assets/ {
access_log off;
expires 24h;
}
这里需要注意的是不可以设置
fastcgi_index index.php;
会让yii "误解"路径
方案三这里是完整的版本,把路径下所有的请求都转给index.php处理,然后禁止.php后缀访问(可以有效防止webshell)
第三种配置方案目前还没有发现什么问题,我也推荐生产环境使用,喜欢大家如果能够发现有什么问题,能够@我一下好修复,谢谢