61阅读

rewrite规则-Rewrite规则怎么写之Apache篇

发布时间:2017-10-30 所属栏目:rewrite

一 : Rewrite规则怎么写之Apache篇

经常看到很多人求助,说他的IDC不支持控制面板做301怎么办,或者说问伪静态规则怎么写,所以写这篇博文,主要本文主要讨论在Apache下,进行编写Rewrite规则。

首先,先说URL的重写规则怎么写。这个主要是用于做伪静态。重写规则是放在.htaccess文件下或Apache的配置文件(httpd.conf或sites_conf目录里的一些特定的网站配置文件),此文主要讨论.htacess文件(其实都差不多)。

打开你的.htacess文件,开头内容如下:

RewriteEngine on

RewriteBase /

RewriteEngine on是代表开启rewrite,而RewriteBase / 是表示所有规则前都存在“/”,写了这条之后,你后面所有规则的开头,只需要写“^”就后了,但要注意的是,此规则仅在.htacess文件中被支持,如果是服务器配置文件,此规则会被忽略、不必写。

在正是写规则前,先为大家讲一下重写中设计到的特殊字符的含义。

*代表前面0或更多个字符

+代表前面1或更多个字符

?代表前面0或1个字符

^代表字符串的开始位置

$代表字符串结束的位置

。为通配符,代表任何字符

将跟在其后的字符还原为字符本身,例如“+”代表的就是“+”,而非其它意思。

^在方括号里表示非的意思。例如[^.]代表非通配符。

那么假如我们希望将“http://www.AAA.com/b.php?id=1″此类URL伪静态为“http://www.AAA.com/b/1″的形式,则规则如下:

RewriteRule ^b/([0-9]+)/?$/b.php?id=$1 [L]

上面的例子中,^表示域名后来的URL的开始,$表示字符串结束,也就是域名后面的URL结束。[0-9]表示一个数字,因为只要URL存在,其必然存在一个id数字。紧接其后的+表示表示出现1个或多个数字。[0-9]+连在一起,表示字符以数字形式出现,数字范围为0-9,出现次数为1或多次。$表示字符串结束,?$表示在根域名后到域名结束,有0或1个字符。$1表示存在内存中的内容,也就是说第一个圆括号中的内容。[L]表示如果规则匹配就停止,否则需要继续运行剩下的规则,通常这个没必要深究。

那除非伪静态外,有时候我们还需要利用.htacess进行301重定向。符号含义不变,举例如下:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^AAA.com$ [NC]

RewriteRule ^(.*) http://www.AAA.com/$1 [R=301,L]

上述规则是将AAA.com 301 到 www.AAA.com,符号的含义相信不必再做解释了。

那么经过这两条规则,你应该有所启发了,如果你的网站做改版,导致你的URL结构发生了变化,怎么办?答案很简单,我们可以利用.htacess文件,通过写rewrite规则,将老的URL 301到新的URL上。

RewriteRule ^(.*?)/?index.html$/$1? [L,R=301]

这个规则是将域名下搜有a/index.html 301 到 a/ 的URL下。规则是死的,最重要的是大家要活学活用,相信熟练掌握rewrite规则后,你会发现网站所有的URL与返回码将会全部在你的掌控下!

本文首发天津seo: 转载请注明。

注:相关网站建设技巧阅读请移步到建站教程频道。

二 : Apache Rewrite 规则详解

1、Rewrite规则简介:

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。(www.61k.com]可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下 直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。

基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

2、举例说明:

下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和203.81.23.202都跳转到 主机前缀为http://www.colorme.com.cn,避免当用户在地址栏写入http://colorme.com.cn时不能以会员方式登 录网站。

NameVirtualHost 192.168.100.8:80

ServerAdmin webmaster@colorme.com.cn
DocumentRoot “/web/webapp”
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.colorme.com.cn [NC] #声明Client请求的主机中前缀不是www.colorme.com.cn,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
RewriteRule ^/(.*) http://www.colorme.com.cn/ [L]
#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.colorme.com.cn/,[L]意味着立即停 止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是 引用前面里的(.*)字符。
例二.将输入 folio.test.com 的域名时跳转到profile.test.com

listen 8080
NameVirtualHost 10.122.89.106:8080
ServerAdmin webmaster@colorme.com.cn
DocumentRoot “/usr/local/www/apache22/data1/”
ServerName profile.test.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^folio.test.com [NC]
RewriteRule ^/(.*) http://profile.test.com/ [L]

3.Apache mod_rewrite规则重写的标志一览

1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
13) PT(pass through to next handler) 传递给下一个处理
例如:
  RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
  Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

4.Apache rewrite例子集合

  在 httpd 中将一个域名转发到另一个域名虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的, 让它在新的域名下继续有效,点击后转发到, 这就需要用 apache 的 Mod_rewrite 功能来实现。

在中添加下面的重定向规则:

RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

添加了上面的规则以后, 里的全部内容如下:

ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
ServerName www.webhosting-world.com
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com

扩展:apache rewrite 详解 / apache rewrite 规则 / apache rewrite


RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

URL重定向

例子一:

1.http://www.zzz.com/xxx.php-> http://www.zzz.com/xxx/
2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user\.php$
RewriteCond %{REQUEST_URI} \.php$
RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^\.]+)\.zzz\.com http://www.zzz.com/user.php?username=$1

例子二:

/type.php?typeid=*  –> /type*.html
/type.php?typeid=*&page=*  –> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]

5.使用Apache的URL Rewrite配置多用户虚拟服务器

  要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的这台Linux Server上。

然后,看一下我的Apache中关于*.semcase.com的虚拟主机的设定。

#*.com,*.osall.net

ServerAdmin webmaster@semcase.com
DocumentRoot /home/www/www.semcase.com
ServerName dns.semcase.com
ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net
CustomLog /var/log/httpd/osa/access_log.log” common
   ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312   
  
     
RewriteEngine on      
RewriteCond %{HTTP_HOST}       ^[^.]+\.osall\.(com|net)$      
RewriteRule ^(.+)    %{HTTP_HOST}$1  [C]      
RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$
/home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
在这段设定中,我把*.semcase.net和*.semcase.com 的Document Root都设定到了 /home/www/www.semcase.com

但是,继续看下去,看到…配置了吗?在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.semcase.com 或者 xxxx.semcase.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www /dev.semcase.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中 指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏 览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。

这样设置后,重启Apache服务器,测试一下,就大功告成了!

扩展:apache rewrite 详解 / apache rewrite 规则 / apache rewrite

三 : nginx rewrite规则

rewrite ^/b/(.*)\.html /play.php?video=$1 break;

如果加上if语句,示例如下:

if (!-f $request_filename)

rewrite ^/img/(.*)$ /site/$host/images/$1 last;

Nginx与Apache的Rewrite规则实例对比

简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。[www.61k.com)例如:

Apache Rewrite 规则:

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]

RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]

Nginx Rewrite 规则:

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;

由以上示例可以看出,Apache的Rewrite规则改为Nginx的Rewrite规则,其实很简单:Apache的RewriteRule指令换成Nginx的rewrite指令,Apache的[L]标记换成Nginx的last标记,中间的内容不变。

如果Apache的Rewrite规则改为Nginx的Rewrite规则后,使用nginx -t命令检查发现nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:

rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;

加上引号就正确了:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;

Apache与Nginx的Rewrite规则在URL跳转时有细微的区别:

Apache Rewrite 规则:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]

Nginx Rewrite 规则:
rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;

以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。

另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:

Apache Rewrite 规则:
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]

Nginx Rewrite 规则:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host  last;

Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:

Apache的RewriteCond指令对应Nginx的if指令;
Apache的RewriteRule指令对应Nginx的rewrite指令;
Apache的[R]标记对应Nginx的redirect标记;
Apache的[P]标记对应Nginx的last标记;
Apache的[R,L]标记对应Nginx的redirect标记;
Apache的[P,L]标记对应Nginx的last标记;
Apache的[PT,L]标记对应Nginx的last标记;

允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com

Apache Rewrite 规则:
RewriteCond %{HTTP_HOST}   ^(.*?)\.domain\.com$
RewriteCond %{HTTP_HOST}   !^qita\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [L]

Nginx的if指令不支持嵌套,也不支持AND、OR等多条件匹配,相比于Apache的RewriteCond,显得麻烦一些,但是,我们可以通过下一页的Nginx配置写法来实现这个示例:

Nginx Rewrite 规则:
if ($host ~* ^(.*?)\.domain\.com$) set $var_wupin_city $1;
    set $var_wupin ‘1′;

if ($host ~* ^qita\.domain\.com$)

   set $var_wupin ‘0′;

 if (!-f $document_root/market/$var_wupin_city/index.htm)

    set $var_wupin ‘0′;

if ($var_wupin ~ ‘1′)

   rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}

rewrite 的语法

语法:rewrite regex replacement flag

默认:none

作用域:server, location, if

This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.

这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。

Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。

rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的因此,我们只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。

nginx的rewrite规则参考:

  1. ~ 为区分大小写匹配
  2. ~* 为不区分大小写匹配
  3. !~和!~*分别为区分大小写不匹配及不区分大小写不匹

  1. -f和!-f用来判断是否存在文件
  2. -d和!-d用来判断是否存在目录
  3. -e和!-e用来判断是否存在文件或目录
  4. -x和!-x用来判断文件是否可执行

  • last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
  • break 终止匹配, 不再匹配后面的规则
  • redirect 返回302临时重定向 地址栏会显示跳转后的地址
  • permanent 返回301永久重定向 地址栏会显示跳转后的地址
    1. $args
    2. $content_length
    3. $content_type
    4. $document_root
    5. $document_uri
    6. $host
    7. $http_user_agent
    8. $http_cookie
    9. $limit_rate
    10. $request_body_file
    11. $request_method
    12. $remote_addr
    13. $remote_port
    14. $remote_user
    15. $request_filename
    16. $request_uri
    17. $query_string
    18. $scheme
    19. $server_protocol
    20. $server_addr
    21. $server_name
    22. $server_port
    23. $uri

    结合QeePHP的例子

    1. if (!-d $request_filename) {
    2. rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
    3. rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;
    4. break;

    多目录转成参数
    abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

    1. if ($host ~* (.*)\.domain\.com) {
    2. set $sub_name $1;
    3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
    4. }

    目录对换
    /123456/xxxx -> /xxxx?id=123456

    1. rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

    例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

    1. if ($http_user_agent ~ MSIE) {
    2. rewrite ^(.*)$ /nginx-ie/$1 break;
    3. }

    目录自动加“/”

    1. if (-d $request_filename){
    2. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
    3. }

    禁止htaccess

    1. location ~/\.ht {
    2. deny all;
    3. }

    禁止多个目录

    1. location ~ ^/(cron|templates)/ {
    2. deny all;
    3. break;
    4. }

    禁止以/data开头的文件
    可以禁止/data/下多级目录下.log.txt等请求;

    1. location ~ ^/data {
    2. deny all;
    3. }

    禁止单个目录
    不能禁止.log.txt能请求

    1. location /searchword/cron/ {
    2. deny all;
    3. }

    禁止单个文件

    1. location ~ /data/sql/data.sql {
    2. deny all;
    3. }

    给favicon.ico和robots.txt设置过期时间;
    这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

    1. location ~(favicon.ico) {
    2. log_not_found off;
    3. expires 99d;
    4. break;
    5. }

    6. location ~(robots.txt) {
    7. log_not_found off;
    8. expires 7d;
    9. break;
    10. }

    设定某个文件的过期时间;这里为600秒,并不记录访问日志

    1. location ^~ /html/scripts/loadhead_1.js {
    2. access_log  off;
    3. root /opt/lampp/htdocs/web;
    4. expires 600;
    5. break;
    6. }

    文件反盗链并设置过期时间
    这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
    “rewrite ^/ http://leech.divmy.com/leech.gif;”显示一张防盗链图片
    “access_log off;”不记录访问日志,减轻压力
    “expires 3d”所有文件3天的浏览器缓存

    1. location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
    2. valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
    3. if ($invalid_referer) {
    4. rewrite ^/ http://leech.divmy.com/leech.gif;
    5. return 412;
    6. break;
    7. }
    8. access_log  off;
    9. root /opt/lampp/htdocs/web;
    10. expires 3d;
    11. break;
    12. }

    只充许固定ip访问网站,并加上密码

    1. root /opt/htdocs/www;
    2. allow  208.97.167.194;
    3. allow  222.33.1.2;
    4. allow  231.152.49.4;
    5. deny  all;
    6. auth_basic “C1G_ADMIN”;
    7. auth_basic_user_file htpasswd;

    将多级目录下的文件转成一个文件,增强seo效果
    /job-123-456-789.html 指向/job/123/456/789.html

    1. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

    将根目录下某个文件夹指向2级目录
    如/shanghaijob/ 指向 /area/shanghai/
    如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/

    1. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

    上面例子有个问题是访问/shanghai 时将不会匹配

    1. rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
    2. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

    这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
    如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。

    那我加上自动跳转也是不行咯
    (-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

    1. if (-d $request_filename){
    2. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
    3. }

    知道原因后就好办了,让我手动跳转吧

    1. rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;
    2. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

    文件和目录不存在的时候重定向:

    1. if (!-e $request_filename) {
    2. proxy_pass http://127.0.0.1;
    3. }

    域名跳转

    1. server
    2. {
    3. listen    80;
    4. server_name jump.88dgw.com;
    5. index index.html index.htm index.php;
    6. root /opt/lampp/htdocs/www;
    7. rewrite ^/http://www.88dgw.com/;
    8. access_log off;
    9. }

    多域名转向

    1. server_name www.7oom.com/  www.divmy.com/;
    2. index index.html index.htm index.php;
    3. root /opt/lampp/htdocs;
    4. if ($host ~ “c1gstudio\.net”) {
    5. rewrite ^(.*)http://www.7oom.com$1/permanent;
    6. }

    三级域名跳转

    1. if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) {
    2. rewrite ^(.*)http://top.88dgw.com$1/;
    3. break;
    4. }

    域名镜向

    1. server
    2. {
    3. listen    80;
    4. server_name mirror.c1gstudio.com;
    5. index index.html index.htm index.php;
    6. root /opt/lampp/htdocs/www;
    7. rewrite ^/(.*)http://www.divmy.com/$1last;
    8. access_log off;
    9. }

    某个子目录作镜向

    1. location ^~ /zhaopinhui {
    2. rewrite ^.+http://zph.divmy.com/last;
    3. break;
    4. }

    discuz ucenter home (uchome) rewrite

    1. rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last;
    2. rewrite ^/(space|network)\.html$ /$1.php last;
    3. rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

    discuz 7 rewrite

    1. rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
    2. rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
    3. rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last;
    4. rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
    5. rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
    6. rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

    给discuz某版块单独配置域名

    1. server_name bbs.c1gstudio.com news.c1gstudio.com;

    2. location = / {
    3. if ($http_host ~ news\.divmy.com$) {
    4. rewrite ^.+last;
    5. break;
    6. }
    7. }

    discuz ucenter 头像 rewrite 优化

    1. location ^~ /ucenter {
    2. location ~ .*\.php?$
    3. {
    4. #fastcgi_pass unix:/tmp/php-cgi.sock;
    5. fastcgi_pass 127.0.0.1:9000;
    6. fastcgi_index index.php;
    7. include fcgi.conf;
    8. }

    9. location /ucenter/data/avatar {
    10. log_not_found off;
    11. access_log  off;
    12. location ~ /(.*)_big\.jpg$ {
    13. error_page 404 /ucenter/images/noavatar_big.gif;
    14. }
    15. location ~ /(.*)_middle\.jpg$ {
    16. error_page 404 /ucenter/images/noavatar_middle.gif;
    17. }
    18. location ~ /(.*)_small\.jpg$ {
    19. error_page 404 /ucenter/images/noavatar_small.gif;
    20. }
    21. expires 300;
    22. break;
    23. }
    24. }

    jspace rewrite

    1. location ~ .*\.php?$
    2. {
    3. #fastcgi_pass unix:/tmp/php-cgi.sock;
    4. fastcgi_pass 127.0.0.1:9000;
    5. fastcgi_index index.php;
    6. include fcgi.conf;
    7. }

    8. location ~* ^/index.php/
    9. {
    10. rewrite ^/index.php/(.*) /index.php?$1 break;
    11. fastcgi_pass 127.0.0.1:9000;
    12. fastcgi_index index.php;
    13. include fcgi.conf;
    14. }

    另外这里还有一个工具可以直接把apache规则转化为nginx规则

    http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

    参考:

    http://wiki.nginx.org/NginxChsHttpRewriteModule

    http://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx

    四 : wordpress 博客永久链接完整rewrite规则

    今天是SEO每日一贴博客值得纪念的一天。困扰白开水本人多日的wordpress博客永久链接rewrite规则问题终于解决了。
    开始本站是用动态的带ID号为文章地址,然后,又配置了永久链接功能,在网上搜索了一堆关于wordpress博客永久链接rewrite规则,然后综合对比,整出了适合自己网站使用的永久链接Rewrite规则。
    随着SEO每日一贴网站信息的增加,SEO相关内容的增多,问题也随之而来,先是发现评论有问题,发表了评论后不能返回到相应文章页面,随后解决了。
    然后又发现了本站分类文章页当超过设定的每页显示信息条数之后,点击下一页时,出现404找不到文件的错误。
    然后,又在本站增加了Tags标签功能,也是,信息量的增加,分页时也出现同样的404错误。
    明显是永久链接的Rewrite规则有问题。于是,着手更新,无论怎么修改,都是错误,好生气,费了近一天没有解决。
    没办法,通过5季网站加ZAC大哥为好友,给他发信息求教,没有反应。又通过hotmail给ZAC大哥写信求教,还是没有反应。又在SEObbs论坛发贴,在点石发贴等专业SEO人才聚集的地方请教,都没有人解决。
    今天白开水下定决心,要不停的测试,不停的Rewrite规则重写,总要试出来不行,呵呵,功夫不费有心人,终于解决了。至次为止,wordpress博客永久链接完整rewrite规则也就出来了。
    下面是wordpress博客永久链接完整rewrite规则,有需要的请拿去用吧。


    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    #RewriteRule . /index.php [L]
    RewriteRule /sitemap.xml /sitemap.xml [L]
    RewriteRule /wp-(.*) /wp-$1 [L]
    RewriteRule ^/$ /index.php [L]
    RewriteRule /(.*) /index.php/$1 [L]
    RewriteRule /tag/(.*) /index.php?tag=$1
    RewriteRule /(contact|about|sitemap|services|update-log|privacy|tools|links|exchange)/ /index.php?pagename=$1
    RewriteRule /category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?category_name=$1&feed=$2
    RewriteRule /category/?(.*)/ /index.php?category_name=$1
    RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed.php?author_name=$1&feed=$2
    RewriteRule /author/(.*)/page/(.*)/$ /index.php?author_name=$1&page=$2
    RewriteRule /author/?(.*) /index.php?author_name=$1
    RewriteRule /feed/?$ /index.php/?feed=rss2
    RewriteRule /comments/feed/?$ /index.php/?feed=comments-rss2
    RewriteRule /page/(.*)/ /index.php?paged=$1
    RewriteRule /([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index.php?year=$1&monthnum=$2&day=$3&name=$4&page=$5
    RewriteRule /([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3&page=$4
    RewriteRule /([0-9]{4})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&page=$3
    RewriteRule /([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/(feed|rdf|rss|rss2|atom)/?$ /index.php?year=$1&monthnum=$2&day=$3&name=$4&feed=$5
    RewriteRule /([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/trackback/?$ /wp-trackback.php?year=$1&monthnum=$2&day=$3&name=$4&tb=1


    如果你对次WordPress博客的永久链接Rewrite规则有什么问题,请留言,交流学习。感觉这里面还有问题存在,只是暂时没有发现吧。欢迎你的指正。

    五 : Rewrite规则怎么写之Apache篇

      经常看到很多人求助,说他的IDC不支持控制面板做301怎么办,或者说问伪静态规则怎么写,所以写这篇博文,主要本文主要讨论在Apache下,进行编写Rewrite规则。

      首先,先说URL的重写规则怎么写。这个主要是用于做伪静态。重写规则是放在.htaccess文件下或Apache的配置文件(httpd.conf或sites_conf目录里的一些特定的网站配置文件),此文主要讨论.htacess文件(其实都差不多)。

      打开你的.htacess文件,开头内容如下:

      RewriteEngine on

      RewriteBase /

      RewriteEngine on是代表开启rewrite,而RewriteBase / 是表示所有规则前都存在“/”,写了这条之后,你后面所有规则的开头,只需要写“^”就后了,但要注意的是,此规则仅在.htacess文件中被支持,如果是服务器配置文件,此规则会被忽略、不必写。在正是写规则前,先为大家讲一下重写中设计到的特殊字符的含义。

      *代表前面0或更多个字符

      +代表前面1或更多个字符

      ?代表前面0或1个字符

      ^代表字符串的开始位置

      $代表字符串结束的位置

      .为通配符,代表任何字符

      将跟在其后的字符还原为字符本身,例如“+”代表的就是“+”,而非其它意思。

      ^在方括号里表示非的意思。例如[^.]代表非通配符。

      那么假如我们希望将“http://www.***.com/b.php?id=1″此类URL伪静态为“http://www.***.com/b/1″的形式,则规则如下:

      RewriteRule ^b/([0-9]+)/?$/b.php?id=$1 [L]

      上面的例子中,^表示域名后来的URL的开始,$表示字符串结束,也就是域名后面的URL结束。[0-9]表示一个数字,因为只要URL存在,其必然存在一个id数字。紧接其后的+表示表示出现1个或多个数字。[0-9]+连在一起,表示字符以数字形式出现,数字范围为0-9,出现次数为1或多次。$表示字符串结束,?$表示在根域名后到域名结束,有0或1个字符。$1表示存在内存中的内容,也就是说第一个圆括号中的内容。[L]表示如果规则匹配就停止,否则需要继续运行剩下的规则,通常这个没必要深究。

      那除非伪静态外,有时候我们还需要利用.htacess进行301重定向。符号含义不变,举例如下:

      RewriteEngine on

      RewriteCond %{HTTP_HOST} ^seozhao.com$ [NC]

      RewriteRule ^(.*) http://www.***.com/$1 [R=301,L]

      上述规则是将seozhao.com 301 到 www.***.com,符号的含义相信不必再做解释了。

      那么经过这两条规则,你应该有所启发了,如果你的网站做改版,导致你的URL结构发生了变化,怎么办?答案很简单,我们可以利用.htacess文件,通过写rewrite规则,将老的URL 301到新的URL上。

      RewriteRule ^(.*?)/?index.html$/$1? [L,R=301]

      这个规则是将域名下搜有a/index.html 301 到 a/ 的URL下。规则是死的,最重要的是大家要活学活用,相信熟练掌握rewrite规则后,你会发现网站所有的URL与返回码将会全部在你的掌控下!

      本文首发天津seo: 转载请注明

    本文标题:rewrite规则-Rewrite规则怎么写之Apache篇
    本文地址: http://www.61k.com/1087709.html

    61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1