找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜索

扫描二维码

如何将apache伪静态规则转换成nginx

热度 5已有 17216 次阅读2012-11-16 20:25 | nginx

  很多用户的程序,官方仅提供了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目前的中文资料很少,需要大家努力贡献。




路过

雷人
1

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

发表评论 评论 (15 个评论)

回复 达意 2012-11-16 20:26
首先
打开source\function下的function_core.php
找到

    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文件,传到网站根目录
回复 达意 2012-11-16 20:27
# 将 RewriteEngine 模式打开
RewriteEngine On
# 修改以下语句中的RewriteBase 后的地址为你的论坛目录地址,如果程序放在根目录中,为 /,如果是相对论坛根目录是其他目录则写为 /{目录名},如:在bbs 目录下,则写为 /bbs
RewriteBase /
# Rewrite 系统规则请勿修改
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^topic-(.+)\.html$ portal.php?mod=topic&topic=$1&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ portal.php?mod=view&aid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(\w+)/([0-9]+)$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^thread-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^group-([0-9]+)-([0-9]+)\.html$ forum.php?mod=group&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^space-(username|uid)-(.+)\.html$ home.php?mod=space&$1=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([a-z]+)-(.+)\.html$ $1.php?rewrite=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule forum-([0-9a-z_]+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1

## 保留前面的部分可以不影响已经被搜索引擎收录的页面

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule /([0-9]+)(/([0-9]+))?(/)?$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$5&page=$3&%1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([0-9a-z_]+)(/([0-9]+))?(/)?$ forum.php?mod=forumdisplay&fid=$1&page=$3&%1 [L,NC]
回复 达意 2012-11-16 20:34
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/
回复 达意 2012-11-19 11:16
新浪sae_url_rewrite(伪静态、重定向)详解

sae全程Sina App Engine,真是一个好东西,他有很多优秀的特性,简单来说SAE就是一个简单高效的分布式Web服务开发、运行平台。

支持现在常用的 php+mysql环境,在开发中难免会碰到项目需要做url rewrite(伪静态),然而sae不支持 apache 下的.htaccess 。不过不要难过,sae提供了自己的rewrite方式,本文我们就对sae的rewrite做个介绍,希望需要的同志能快速根据自己需求写想要的规则
config.yaml简介

sae的配置文件在每个应用的根目录里面,名字是config.yaml。这个文件就类似于apache的.htaccess,所有的伪静态规则,404设置等都在这里配置。
config.yaml内容格式

name: phpclubsversion: 1handle:    - directoryindex: index.php index.html index.htm    - errordoc: 404 /path/404.html    - rewrite: if(!is_dir( ) && path ~ "urldir/(.*)") goto "/tools/$1"

上面是一个应用里面的config.yaml文件第一行  表示 当前应用的名字第二行  表示 当前应用的代码的版本第三行  handle 下面的就是我要写的规则
config.yaml修改途径

我们创建项目版本时系统会自动生成config.yaml文件在根目录(如果没有自己可以手动创建一个),一方面 我们可以通过 在线编辑器(SAE CLOUD EDITOR) 进行编辑config.yaml文件。另一方面我们还可以使用svn本地编辑,提交到服务器,修改都是实时生效的。
语法说明

AppConfig的语法分两种,一种是简单的参数罗列方式,一种是灵活的表达式语法,不同的功能会用到不同的类型的语法

1、表达式语法

其形式为:

if (表达式) 执行规则

表达式 有如下形式:

1) in_header["header_name"] op string_or_digit

2) out_header["header_name"] op string_or_digit

3) path op string

4) query_string op string

5) is_file()

6) is_dir()

关于以上形式说明如下:

1) in_header 是请求头,out_header 是响应头,header_name 是 header 的名字,这个我们一般用到的不多

2) op 是操作符,有 ~(正则匹配) !~(正则不匹配) ==(相等,用于字符串和数字) !=(不相等,用于字符串和数字) >, >=, <, <=(比较操作符仅用于整形数字),其中~正则匹配 用的比较多

3) string 是形如 “xxxx” 的字符串

4) string_or_digit 表示 string 或者 digit,根据 op 的种类,后面跟 string 或者 digit

5) path 是系统宏,表示用户请求的 url 去掉主机部分和查询串后剩下的部分,用到的很多,例如:http://www.xxx.com/list/test.php?id=23  path就是 /list/test.php

6) query_string 是系统宏,表示查询串,一般是url中问号后面的内容 例如上面 的url 中的 id=23

7) is_file() 和 is_dir 是系统函数,判断 path 是文件还是目录,!is_file(),!is_dir() 分别是其否定形式。(使用也比较多)

2、URL重写

- rewrite: if (表达式) goto 目标url

在 rewrite 中,表达式 可以用 && 连接,组成复合表达式。 path 只能出现一个(如果有多个,只有最后一个生效,其它被忽略),当省略 path 时,表示任意请求。

    target_url 表示重定向的目标url,在target_url 可以以 $N 的形式表示 path 中匹配到的内容,%N 的形式表示最后一个query_string 中匹配到的内容,因为query_string 可以在 if 中出现多次,以%{QUERY_STRING} 表示查询串。    例如:- rewrite: if(query_string ~ “^(so)$” && path ~ “zhaochou$”) goto “/url/%1″

- rewrite: if(is_dir( ) && path ~ “urldir/(.*)”) goto “/url/$1″

- rewrite: if( !is_file() && !is_dir()) goto “index.php?%{QUERY_STRING}”

比如我们要先下面的伪静态

实例1

真实处理地址为: www.xxx.com/index.php?a=list&b=new&id=23

要伪静态成这样:www.xxx.com/list-new-23.html

规则 -rewrite: if(path ~ “list-new-(\d+)\.html”) goto “index.php?a=list&b=new&id=$1″

实例2

真实处理地址为: www.xxx.com/index.php?a=list&b=new&id=23

要伪静态成这样:www.xxx.com/list-new.php?id=23

规则 -rewrite: if(path ~ “list-new\.php” && query_string ~ “id=(\d+)”) goto “index.php?a=list&b=new&id=%1″

3、自定义目录默认页面

当访问url没有指定文件的路径时,返回aaa.php,如果其不存在,则返回bbb.html
    – directoryindex: aaa.php bbb.html

4、自定义错误页面(404页面等)
    遇到 404 错误,返回 /path/404.html 文件。    遇到 403 错误,返回 /path/403.html 文件    – errordoc: 404 /path/404.html    – errordoc: 403 /path/403.html

5、对文件目录进行简单的访问权限认证

   访问secret目录需要密码,允许用户test用密码123qwe访问,用户coder用密码123asd访问
    – passwdaccess: if(path ~ “/secret/”) passwd “test:123qwe coder:123asd”    访问.text结尾的文件需要密码,允许用户writer用密码123zxc    – passwdaccess: if(path ~ “\.text$”) passwd “writer:123zxc”    所有访问都要密码,允许用户writer用密码123zxc访问    – passwdaccess: passwd “write:123zxc”    用户的网站后台程序都放在admin目录下,需要对admin目录做密码保护    – passwdaccess: if(path ~ “/admin/”) passwd “admin:admin123″
尾语

相信你试完上面的东西,应该可以自己写想要的规则了。祝你好运。。。

另外附上一个Appconfig 配置生成工具 http://saetools.sinaapp.com/
回复 达意 2013-10-21 21:50
Nginx批量301重定向设置实例

单一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的不同,代码大家以自己的情况而适当修改。有问题可以到我们论坛发贴,我会在第一时间回复。
回复 MJLMNET 2013-10-26 16:02
达意: # 将 RewriteEngine 模式打开
RewriteEngine On
# 修改以下语句中的RewriteBase 后的地址为你的论坛目录地址,如果程序放在根目录中,为 /,如果是相对论坛根目录 ...
楼主能不能帮忙把这段伪静态规则转换成niginx的啊,我最近把服务器从apache换成niginx的,但是伪静态规则反复修改还是出错
回复 达意 2013-10-26 18:17
MJLMNET: 楼主能不能帮忙把这段伪静态规则转换成niginx的啊,我最近把服务器从apache换成niginx的,但是伪静态规则反复修改还是出错
是dz的niginx伪静态规则还是其他?
回复 MJLMNET 2013-10-27 16:22
达意: 是dz的niginx伪静态规则还是其他?
就是把针对discuz程序的后面那一段apache伪静态规则转换成nginx的规则:
## 保留前面的部分可以不影响已经被搜索引擎收录的页面

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule /([0-9]+)(/([0-9]+))?(/)?$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$5&page=$3&%1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([0-9a-z_]+)(/([0-9]+))?(/)?$ forum.php?mod=forumdisplay&fid=$1&page=$3&%1 [L,NC]
回复 达意 2014-3-25 21:55
/source/function/function_cloudaddons.php

    cpmsg(‘cloudaddons_genuine_message’, ”, ‘error’, array(‘addonid’ => $addonid));注释
回复 topengHem 2018-1-7 00:50
Доля правды тут присутствует...
回复 Frankkem 2018-2-15 16:34
kontakt@e-printec.com.pl
biuro@e-printec.com.pl


tel:508 052 990

ukasz Jarosiński

ul. Lipowa 8/1, 64-965 Okonek

NIP: 673-172-03-67, REGON: 320200145
spamujemy email
回复 englisHem 2018-3-11 03:18
Не понимаю зачем так было делать!
回复 englisHem 2018-3-12 06:53
Интересненько:(
回复 englisHem 2018-3-16 02:33
Неожидано как то:)
回复 DD123321dd 2024-4-28 16:47
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,
                );

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

Archiver|手机版|小黑屋|广告合作|大亚湾在线 ( 粤ICP备12059854号 )

GMT+8, 2024-5-15 09:00 , Processed in 0.049459 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部