本帖最后由 littlehz 于 2009-7-25 00:16 编辑
常见规则解读:
- RewriteRule (.*) /test.html [L,R=301]
- #请求的任意URI 301跳转到/test.html
- RewriteRule ^(.*)$ /test.html [L,R=301]
- #这句其实效果和前一个一样,只是判断条件为当且仅当任意字符开始任意字符结束。
- RewriteRule ^(.*) https://discuz.dismall.com/$1 [R=301,L]
- #把当前主机收到的所有请求全部跳转到https://discuz.dismall.com/主机,$1这个变量为前面匹配的任意多个字符。适用于整体更换域名,本规则写在原域名下。
- RewriteRule ^/abc/(.*) /def/$1 [R=301,L]
- #匹配以/abc/开始的请求,跳转到/def/,$1为之前匹配的任意多个字符。301跳转。
- #例如请求http://www.littz.cn/abc/jjjjjwerwerew.html,会301跳转到http://www.littz.cn/def/jjjjjwerwerew.html,相当于给def目录建立了一个别名abc。
- RewriteRule ^/type-([0-9]+).html$ /type.php?typeid=$1 [L]
- #匹配以/type-开始的,并且后面接了1个或者多个数字,再后面接上.html的请求,并且以其结束的。内部跳转至/type.php?type=$1处理,$1为[0-9]+匹配得到的数字。
复制代码 官方的SS for Apache Rewrite规则解读- <IfModule mod_Rewrite.c>
- #如果Apache安装并启用了mod_Rewrite.c模块
- RewriteEngine On
- #启用Rewrite
- ###Rewrite 系统规则请勿修改
- RewriteRule ^/([0-9]+)/spacelist(.+)$ /index.php?uid/$1/action/spacelist/type$2 [L]
- # 开始/{1个或多个数字}/spacelist{1个或多个任意字符}结束,内部跳转到 /index.php?uid/{匹配的数字}/action/spacelist/type{匹配的1个或多个任意字符} 处理
- RewriteRule ^/([0-9]+)/viewspace(.+)$ /index.php?uid/$1/action/viewspace/itemid$2 [L]
- # 开始/{1个或多个数字}/viewspace{1个或多个任意字符}结束,内部跳转到 /index.php?uid/{匹配的数字}/action/viewspace/itemid{匹配的1个或多个任意字符} 处理
- RewriteRule ^/([0-9]+)/viewbbs(.+)$ /index.php?uid/$1/action/viewbbs/tid$2 [L]
- # 开始/{1个或多个数字}/viewbbs{1个或多个任意字符}结束,内部跳转到 /index.php?uid/{匹配的数字}/action/viewbbs/tid{匹配的1个或多个任意字符} 处理
- RewriteRule ^/([0-9]+)/(.*)$ /index.php?uid/$1/$2 [L]
- # 开始/{1个或多个数字}/{任意个任意字符}结束,内部跳转到 /index.php?uid/{匹配的数字}/{匹配的任意个任意字符} 处理
- RewriteRule ^/([0-9]+)$ /index.php?uid/$1 [L]
- # 开始/{1个或多个数字}结束,内部跳转到 /index.php?uid/{匹配的数字}处理
- RewriteRule ^/action(.+)$ /index.php?action$1 [L]
- # 开始/action{任意个任意字符}结束,内部跳转到 /index.php?action/{匹配的任意个任意字符}处理
- RewriteRule ^/category(.+)$ /index.php?action/category/catid$1 [L]
- # 开始/category{任意个任意字符}结束,内部跳转到 /index.php?action/category/catid{匹配的任意个任意字符}处理
- #例如http://www.littz.cn/category-1.html,实际是发给了http://www.littz.cn/index.php?action/category/catid-1.html
- RewriteRule ^/viewnews(.+)$ /index.php?action/viewnews/itemid$1 [L]
- # 开始/viewnews{任意个任意字符}结束,内部跳转到 /index.php?action/viewnews/itemid{匹配的任意个任意字符}处理
- #例如http://www.littz.cn/viewnews-340.html,实际是发给了http://www.littz.cn/index.php?action/viewnews/itemid-340.html
- RewriteRule ^/viewthread(.+)$ /index.php?action/viewthread/tid$1 [L]
- # 开始/viewthread{任意个任意字符}结束,内部跳转到 /index.php?action/viewthread/tid{匹配的任意个任意字符}处理
- RewriteRule ^/mygroup(.+)$ /index.php?action/mygroup/gid$1 [L]
- # 开始/mygroup{任意个任意字符}结束,内部跳转到 /index.php?action/mygroup/gid{匹配的任意个任意字符}处理
- </IfModule>
复制代码 至此,对rewrite应该有一定了解。可以开始自写rewrite了。
下面说的是用rewrite的方法实现,当然可以用其他方法实现,多一种方法。
@@1 原来我用www.abc.com的网址进我的网站,现在有新的网址www.littz.cn,但是不想丢掉原URL的链接,又希望所有通过原URL访问的自动跳转到新URL,怎么办呢?
首先保证www.abc还是受你控制的,在www.abc.com的服务器下写rewrite规则- RewriteRule ^(.*) http://www.littz.cn/$1 [R=301,L]
复制代码 @@2 原来我的ss放在http://www.littz.cn/ss,现移动到上级目录了,http://www.littz.cn,新URL已经能访问,也不想丢掉原URL的链接,又希望所有通过原URL访问的自动跳转到新URL,怎么办呢?
在www.littz.cn的对应的目录下写rewrite规则。(使用于ss路径已经不会再使用的)- RewriteRule ^/ss/(.*) http://www.littz.cn/$1 [R=301,L]
复制代码 @@3 原来我的ss放在http://www.littz.cn/,现移动到supesite目录了,http://www.littz.cn/supesite,新URL已经能访问,也不想丢掉原URL的链接,又希望所有通过原URL访问的自动跳转到新URL,同时http://www.littz.cn/的留给我自己写的一些页面用,怎么办呢?
这个时候规则就不能做(.*)的任意判断跳转了。
一、分析哪些URL是需要跳转的,跳转之后到哪里,哪些链接容易出现匹配冲突。
二、确定跳转关系,书写rewrite规则
三、检查rewrite规则,尤其是容易产生匹配冲突的情况。
本例中,要做的判断是仅为SS的URL才跳转至supesite目录中。
- RewriteRule ^/([0-9]+)/spacelist(.+)$ /supesite/$1/spacelist$2 [L,R=301]
- RewriteRule ^/([0-9]+)/viewspace(.+)$ /supesite/$1/viewspace$2 [L,R=301]
- RewriteRule ^/([0-9]+)/viewbbs(.+)$ /supesite/$1/viewbbs$2 [L,R=301]
- RewriteRule ^/([0-9]+)/(.*)$ /supesite/$1/$2 [L,R=301]
- RewriteRule ^/([0-9]+)$ /supesite/$1 [L,R=301]
- RewriteRule ^/action(.+)$ /supesite/action$1 [L,R=301]
- RewriteRule ^/category(.+)$ /supesite/category$1 [L,R=301]
- RewriteRule ^/viewnews(.+)$ /supesite/viewnews$1 [L,R=301]
- RewriteRule ^/viewthread(.+)$ /supesite/viewthread$1 [L,R=301]
- RewriteRule ^/mygroup(.+)$ /supesite/mygroup$1 [L,R=301]
复制代码 |