很多用户的程序,官方仅提供了apache或IIS的伪静态规则,无法加载到我公司的nginx服务器上,下面就简单介绍下如何将apache转换成nginx可以使用的规则。
RewriteEngine On
RewriteRule ^/([a-z]+)/p_([0-9]+)\.html$ /list\.php\?id=$1
以上为apache的伪静态规则。下面为转换后的nginx规则:
rewrite ^/([a-z]+)/p_([0-9]+)\.html$ /list.php?id=$1 last;
请注意:apache后则不能直接使用点和问号,所以将/list\.php\?id=$1中的"\"去掉,即:/list.php?id=$1
然后,将RewriteRule 换为 rewrite,并在在每条规则后加上”last;“
这样逐条修改就完成了。
Nginx的Rewrite
经过网上查阅和测试,发现Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则
rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;
而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:
rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1 last;
同时将RewriteRule为Rewrite,基本就实现了Nginx的Rewrite规则到Apache的Rewite规则的转换。
Rewrite的Flags
last - 基本上都用这个Flag。
break - 中止Rewirte,不在继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
官方文档请点击这里。
Discuz!在Nginx下的Rewrite
需要说明的是,下网上以前一直流传的Rewrite都是有误的。
下面的Rewrite中百分号前面多了个转移字符“”,这在Apache中是需要的,而在Nginx中则是不需要的。
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
正确的应该是
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。
完整正确的Discuz!在Nginx下的Rewrite如下:
rewrite ^/archiver/((fid|tid)-[w-]+.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+).html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+).html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+).html$ /tag.php?name=$1 last;
break;
Nginx以其良好的并发性能,目前正在逐渐取代Apache成为大家的Web server首选,但是Nginx目前的中文资料很少,需要大家努力贡献。
if($type == 'forum_forumdisplay') {
list(,,, $fid, $page, $extra) = func_get_args();
$r = array(
'{fid}' => empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
'{page}' => $page ? $page : 1,
} elseif($type == 'forum_viewthread') {
list(,,, $tid, $page, $prevpage, $extra) = func_get_args();
$r = array(
'{tid}' => $tid,
'{page}' => $page ? $page : 1,
'{prevpage}' => $prevpage && !IS_ROBOT ? $prevpage : 1,
if($type == 'forum_forumdisplay') {
list(,,, $fid, $page, $extra) = func_get_args();
$r = array(
'{fid}' => empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
'{page}' => $page ,
} elseif($type == 'forum_viewthread') {
list(,,, $tid, $page, $prevpage, $extra) = func_get_args();
$fid = DB::result_first("SELECT fid FROM ".DB::table('forum_thread')." WHERE tid = '$tid'");
$r = array(
'{fid}' => empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
'{tid}' => $tid,
'{page}' => $page ,
'{prevpage}' => $prevpage && !IS_ROBOT ? $prevpage : 1,
然后进入网站后吧->''seo设置"->"url静态化"
在"论坛主题列表页"的格式中填写:{fid}/{page}
在"论坛主题内容页"的格式中填写:{fid}/m{tid}/{page}
然后下载.htaccess文件,传到网站根目录
单一URL的301方法
假设一个页面的原URL为:
http://domain.com/thread-8708-1-1.html
,而改成的新的URL为:
http://domain.com/thread-8708-1.html
,那么301的代码如下:
rewrite ^([^\.]*)/thread-8708-1-1.html$ $1/thread-8708-1.html permanent;
当然,其他更多的URL都可以采用类似的方法,接下来再看看批量的方法。
批量301重定向
就如上面的例子,大量这种URL要重定向到新的页面URL,因为其有一定的规律性,只是减少一个“-1”,也就是忽略第三个参数,那么就可以采用正则表达式来进行批量301重定向,代码如下:
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/thread-$2-$3.html permanent;
根据URL的不同,代码大家以自己的情况而适当修改。有问题可以到我们论坛发贴,我会在第一时间回复。