帮朋友部署一套PHP后台,中间碰到一些rewrite问题,记录一下。
PHP、Mysql、nginx都是已经安装好的,已经部署一套后台在阿里云上。
首先,登录阿里云控制台,在安全组里新增一个端口用于web访问,因为80端口已经被占用,所以只能开一个新端口。
代码上传、解压,nginx配置,首页可正常访问,点击跳转链接报404错误,链接的URL为 http://www.xxx.com:8888/index/usr/login.do
猜测是路由重写的问题,于是把已经部署的那个配置里面的重写规则复制了过来。
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
依然404,看了一下入口文件,发现一句代码
//路由url权重 [0:模块/控制器/方法,1:控制器/方法,2:方法]
'routingWeight'=>0,
//设置伪造后缀
'fix'=>'.do'
于时迅速的修改重写规则
rewrite ^/(.*)/(.*)/(.*)\.do$ /index.php?$1=&$2=$3= last; break;
然并卵,再研究了一下代码里的路由规则,直接发代码
$_gk = array();
foreach ($_GET as $key => $val){
$_gk[] = $key;
}
// 0 - 模块 1 - 控制器 2 - 方法
if (isset($_gk[0])) {
$arg = explode("_", str_replace('.', '_', $_gk[0]));
} else {
$arg = array("");
}
if (isset($_gk[0])) {
//删除arg 0 路由信息,防止出错
unset($_GET[$_gk[0]]);
}
//构造路由信息
$routingInfo = $this->routingAuto(array(
//路径权重
'weight'=>$params['routingWeight'],
//默认路径
'default'=>explode('.', $params['default']),
//访问路径
'visit'=>$arg
));
//启动配置
$this->global_config($params2,$routingInfo,$params);
//控制器路径
require_once (ROOT_PATH . '/run/' . $routingInfo['module'] . '/controller/' . $routingInfo['controller'] . '.php');
简单点讲就是把模块、控制器、方法3个参数用"_"拼接成一个key,重写规则更新如下
rewrite ^/(.*)/(.*)/(.*)\.do$ /index.php?$1_$2_$3= last; break;
完美!