欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

使用APACHE的模块:REWRITE模块语法格式 百分号 % 美元符号 $ 本文中搜%1就明白百分号的意思道理了 有大用

Preface

无论是对于搜索引擎还是对于访客而言,很多网站程序生成的URL并不友好,所以需要将URL以更简短的方式来重写。这种技术可以解决很多常见的问题,如:页面伪静态域名重定向等。URL重写并非只有Apache的rewrite模块能做到,ISAPI也可以实现。但ISAPI只能用于Wndows,国内很多虚拟空间都只支持ISAPI2,功能较弱。rewrite模块的强大在于,他可以用正则来实时重写URL请求,一个规则可以拥有很多子规则、附加条件。

下图是有一条重写条件的重写规则,可以看出Rewrite最基本的格式:重写条件(RewriteCond)是字符串在前,正则在后;重写规则(RewriteRule)是正则在前,字符串在后。本文将从几个简单例子出发,说明一些常用的Rewrite的语法,并解决具体的问题。

EXAMPLE 1



  • RewriteEngine on:开启Rewrite

  • RewriteCond $1 !(index\.php|images):如果文件不为index.php或目录不为images。

  • RewriteRule ^(.*)$ /index.php?page=$1:转给index.php处理。

  • $1代表引用RewriteRule中的第一个正则(.*)代表的字符。RewriteCond中的正则很普通,所以不做说明。RewriteRule中的正则,(.*)代表任意字符,^是开始锚,$是结束锚。

    设置之后,当访问dmyz.org/about时,实际是访问dmyz.org/index.php?page=about,从url中省略掉了index.php。这一规则经常用于框架开发环境,因为大多数框架都是将所有的请求提交给一个入口文件(通常是index.php)来处理的。

    将第三行修改:

    访问dmyz.org/about.htm时实际访问的仍然是dmyz.org/index.php?page=about,这就实现简单的伪静态了。

    EXAMPLE 2


    用这个简单的例子来说明重写条件(RewriteCond)使用的服务器变量特殊正则

    %{REQUEST_FILENAME}获得一个服务器变量的值,!-f是正则,其中感叹号表否定,-f用来检测当前值所代表的路径是否是一个常规文件。因此例2实现的是:当访问的文件不是一个常规文件时,转到404.htm页面。这就是一个简单的用Rewrite实现404页面重定向的例子。还可以补充一下,将其修改为:

    服务器变量有很多,常用的如下表:

    服务器变量用途参考
    %{HTTP_USER_AGENT}访客的浏览器类型Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8GTB7.1
    %{HTTP_REFERER}访问的链接地址http://dmyz.org/archives/99
    %{HTTP_FORWARDED}通过HTTP获得地址,通常是访客的IP地址,但HTTP头可以修改,所以如果要判断访客的IP,推荐使用%{REMOTE_ADDR}192.168.0.1
    %{HTTP_HOST}访问的域名http://dmyz.org
    %{SERVER_ADDR}服务器的IP地址127.0.0.1
    %{REMOTE_ADDR}访客IP地址192.168.0.1
    %{REMOTE_USER}只在HTTP验证中有用,保存验证时使用的用户名admin
    %{REQUEST_METHOD}提交查询的方式GET或是POST
    %{SCRIPT_FILENAME}所访问的文件的绝对路径/var/www/dmyz.org/htdocs/index.php
    %{QUERY_STRING}查询字符串,包含查询变量名和参数page=1&name=dmyz
    %{TIME_YEAR}/%{TIME_MON}/%{TIME_DAY}获取年/月/日2010/09/30

    EXAMPLE 3


    本例中使用了配置指令,和重写规则对重写条件的引用。

    如例2所说,重写条件可以使用服务器变量和特殊正则,但重写规则不可以。所以需要在重写规则中反向引用重写条件的内容。例3中使用%1来反向引用(.*)?。当查询字符串为pageid=任意字符串时,跳转到thread.php?fid=任意字符串。这条正则很适合网站搬家、更换程序后,将原地址转向到新地址。

    前两个例子,重写条件和重写规则都只有两个参数——正则和字符串,本例中追加第三个参数,它被称为标识,跟在重写条件和重写规则之后的,作为辅助、补充之用。本例中使用了最简单三个标识:

  1. [NC]:忽略大小写。

  2. [L]:结尾标识。停止重写操作,并不再应用其他重写规则。防止本条规则被后续规则影响。

  3. [R=301]:利用HTTP 301跳转。

还有其他很有用的标识,可以参考Apache手册


附:最近遇到的几个问题,虽然使用了.htaccess文件,但并未使用rewrite,一并写在这里。设置了Expires headers,关闭了Etag,开启了Wordpress的Gzip压缩。设置之后本站Yslow等级为A。


  



来自  http://dmyz.org/archives/99


一,Rewrite重写时带“?”(问号)参数的传递

很多人都会遇到需要将网站以前的旧URL转换到新版本的新URL来,但是有一些带有参数的地址由于涉及到参数名的变更,需要通过伪静态的方式实现跳转。但Apache和Ngnix的方法是不支持带参数的URL地址重写的(即:RewriteRule不会去匹配“?”后面的字符串的,需要用RewriteCond来匹配)。

例如:把 /abc?id=123 重定向到 /def.php?id=123 的写法: 
方式一:

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^id=(.+)$
RewriteRule ^/abc$ /def.php?sid=%1 [L]
**#注释1:RewriteCond %{QUERY_STRING} ^id=(.+)$ ,得到url中的变量,并通过“%N”的方式获取(参数名可以重写,而且参数值可以匹配)
**#注释2:RewriteCond 里面需要提取的值可以用 %N 进行反向引用值,而RewriteRule里面还是需要用$N的来反向引用值****
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

方式二:

RewriteEngine on
RewriteBase /
RewriteRule ^/abc$ /def.php [L,QSA]
  • 1

  • 2

  • 3

#注释1:[QSA]表示保留重写url时“?”后面的参数(但参数名不可以重写,只会原样的保留)

官方文档解释(查询字符串): 
Pattern不会按照查询字符串进行匹配。为了达到这个目的,你必须使用一个带有% {QUERY_STRING}变量的RewriteCond指令。当然,你也可以在替换字符串中创建包含查询字符串的URL:在替换字符串串中使用问号,以标明其后的部分应该被重新注入到QUERY_STRING中。而要删除一个已有的请求串,则可以用问号来终结替换字符串。为了联合新旧查询字符串,请使用[QSA]标志。

二、apache rewrite 终结篇:apache %{QUERY_STRING} 
1.$n取得第n个参数值

RewriteRule ^sss/(.*)/(.*)$ zdz/index.php?arg1=$1&arg2=$2
  • 1

2.query_string(%{QUERY_STRING}后为匹配的正则) 
URL参数(Query String)是URL里面“?”后面的部分,它通常用于传输参数给CGI脚本或者其它动态页面。在Apache中,该值存储在环境变量QUERY_STRING中(在PHP中,可以通过$_SERVER[‘QUERY_STRING’]访问到)。 
在Apache中,大多对URL进行操作的指令,如、Redirect、Alias和RewriteRule,都不能直 接访问该数据;不过,mod_rewrite模块却可以对URL参数进行添加、删除和修改。其中的关键就是使用RewriteCond来匹配% {QUERY_STRING}变量,如果需要的话,还可以使用[QSA]标志来附加URL参数。

eg.1 
如果 http://127.0.0.1/rewrite/jeecn.zdz?par=helloforbworld 中的 query_string 包含字符串forb ,则禁止访问 
RewriteCond %{QUERY_STRING} forb 
RewriteRule ^(.).(.)$ preg.php?%{QUERY_STRING} [F]

eg.2 
通过[QSA]标志保留原有URL参数的同时,在后面增加新的URL参数:param=value 
RewriteRule ^/page /page?param=value [QSA]

eg3. 
当URL参数包含字符串parm时 
将URL:http://jeecn.com/ask?param=value 重写为: http://jeecn.com/answer?param=value 
RewriteCond %{QUERY_STRING} parm 
RewriteRule ^/ask /answer

eg4.%n反向引用 
1)当访问 /path 时,将字符串 parm修改为 showparm 
RewriteCond %{QUERY_STRING} ^(.)parm(.)$ 
RewriteRule /path /path?%1showparm%2 
上面的%1和%2是反向引用,来自之前的RewriteCond中正则表达式的匹配结果

2)将http://jeecn.com/path?key=value 转换为: http://jeecn.com/path/key/value 
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$ 
RewriteRule ^/path /path/%1/%2?

来自  https://blog.csdn.net/qq_31648761/article/details/53612318


浅析Apache重写规则中RewriteCond规则参数和 RewriteRule 规则参数

一、RewriteCond规则参数

RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,看例子:

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php 
RewriteRule  index.php            index.b.php


上面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
//跳转到对index.m.php的访问
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
//跳转到对index.L.php的访问
}
else
//跳转到对index.b.php的访问

在看例2:
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php
上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。
在看例三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。
下面是自己收藏的一些有用的重写规则:
RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite


二、RewriteRule 规则参数  

这里着重介绍 RewriteRule 规则以及参数说明。


Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。


此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。


这里着重介绍一下 RewriteRule 的规则以及参数说明。RewriteRule指令是重写引擎的根本。此指令可以多次使用。每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要——在运行时,规则是按这个顺序逐一生效的。


RewriteRule Pattern Substitution [flags]
Pattern是一个作用于当前URL的perl兼容的正则表达式。"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。


Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。除了纯文本,还可以包含:
对Pattern的反向引用($N) 
对最后匹配的RewriteCond的反向引用(%N) 
规则条件测试字符串(%{VARNAME})中的服务器变量 
映射函数调用(${mapname:key|default})


[flags]标记作为RewriteRule指令的第三个参数,是一个包含以逗号分隔的下列标记的列表:
'chain|C'(链接下一规则)
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除".www"(此处不应该出现".www")。 
'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(设置cookie)
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如'.apache.org',可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。 
'env|E=VAR:VAL'(设置环境变量)
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后继的RewriteCond指令的CondPattern参数中通过%{ENV:VAR}引用。使用它可以记住从URL中剥离的信息。 
'forbidden|F'(强制禁止URL)
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。 
'gone|G'(强制废弃URL)
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。 
'handler|H=Content-handler'(强制指定内容处理器)
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由"cgi-script"处理器处理。 
'last|L'(结尾规则)
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL('/')为实际存在的URL(比如:'/e/www/')。 
'next|N'(从头再来)
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环! 
'nocase|NC'(忽略大小写)
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,'A-Z'和'a-z'没有区别。 
'noescape|NE'(在输出中不对URI进行转义)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%25', '%24', '%3B'等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:


RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
可以使'/foo/zed转向到一个安全的请求'/bar?arg=P1=zed'。 
'nosubreq|NS'(不对内部子请求进行处理)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx)时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。 
'proxy|P'(强制为代理)
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。 
注意:要使用这个功能,必须已经启用了mod_proxy模块。
'passthrough|PT'(移交给下一个处理器)
此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule指令的输出能够被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的例子: 如果要将/abc重写为/def, 然后再使用mod_alias将/def转换为/ghi,可以这样:


RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果省略了PT标记,虽然将uri=/abc/...重写为filename=/def/...的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。 
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
'qsappend|QSA'(追加查询字符串)
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。 
'redirect|R [=code]'(强制重定向)
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将"/~"重写为"/u/",或始终对/u/user加上斜杠,等等。
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使用'L'标记。 
'skip|S=num'(跳过后继规则)
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和'chain|C'标记是不同的! 
'type|T=MIME-type'(强制MIME类型)
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显示:


RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
RewriteRule example


1.If http://example.com/foo/bar does not exist, redirect to http://other.example.com/foo/bar. (Put this in an .htaccess file in your top-level web directory.)


# .htaccess in root of example.com
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://other.example.com/$1 [R]
2. Handle all requests for top-level .html files and files with no extensions (http://example.com/foo, http://example.com/foo.html) with a single PHP program /foo/show.php. Also, ignore trailing characters in set { : ; , . } so URLs like "http://example.com/foo." can be copied-n-pasted from plain text sentences by inattentive users.


# .htaccess in root of example.com
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]
Examples:


http://www.xzhuji.com/rewriterule
http://www.xzhuji.com/rewriterule.html;
3. Redirect GET requests for http://example.com/foo/bar to http://example.com/bar (and /foo/bar.html to /bar.html). Handle POST requests with PHP program rather than attempting to redirect a POST (which is unlikely to work well).


# .htaccess in foo folder in example.com's document root
RewriteEngine On
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /$1 [R,L,NS]
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/?([^/]*\.html?|[^\./]*)[:;,\.]*$ /foo/show.php [L,NS]
Examples:


http://xzhuji.com/w/rewriterule
http://xzhuji.com/w/rewriterule.html;


Apache Rewrite 规则详解
1、Rewrite规则简介:


Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(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.xzhuji.com和203.81.23.202都跳转到主机前缀为http://www.xzhuji.com,避免当用户在地址栏写入http://xzhuji.com时不能以会员方式登录网站。


NameVirtualHost 192.168.100.8:80
ServerAdmin
DocumentRoot "/web/webapp"
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.xzhuji.com [NC] #声明Client请求的主机中前缀不是]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
RewriteRule ^/(.*) http://www.xzhuji.com/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有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.xzhuji.com, 更加简短好记。这时需要将原来的域名xzhuji.com, 以及论坛所在地址 xzhuji.com.cn/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://www.xzhuji.com/forums/-f60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.xzhuji.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。


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


RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.xzhuji.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.xzhuji.com.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to xzhuji.com.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.xzhuji.com.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.xzhuji.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.xzhuji.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to xzhuji.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.xzhuji.com/$1 [R=permanent,L]
URL重定向


例子一:


1.http://www.zzz.com/xxx.php-> http://www.xzhuji.com/xxx/
2.http://yyy.zzz.com-> http://www.xzhuji.com/user.php?username=yyy 的功能


RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.xzhuji.com
RewriteCond %{REQUEST_URI} !^user\.php$
RewriteCond %{REQUEST_URI} \.php$
RewriteRule (.*)\.php$ http://www.xzhuji.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.xzhuji.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^\.]+)\.zzz\.com http://www.xzhuji.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
DocumentRoot /home/www/www.xzhuji.com
ServerName dns.semcase.com
ServerAlias dns.semcase.com xzhuji.com semcase.net *.xzhuji.com.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.xzhuji.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服务器,测试一下,就大功告成了!


13 个mod_rewrite 应用举例


1.给子域名加www标记 
RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L] 
这个规则抓取二级域名的%1变量,如果不是以www开始,那么就加www,以前的域名以及{REQUEST_URI}会跟在其后。


2.去掉域名中的www标记 
RewriteCond %{HTTP_HOST} !^example\.com$ [NC] 
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]


3.去掉www标记,但是保存子域名 
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC] 
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]
这里,当匹配到1%变量以后,子域名才会在%2(内部原子)中抓取到,而我们需要的正是这个%1变量。 


4.防止图片盗链 
一些站长不择手段的将你的图片盗链在他们网站上,耗费你的带宽。你可以加一下代码阻止这种行为。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F] 
如果{HTTP_REFERER}值不为空,或者不是来自你自己的域名,这个规则用[F]FLAG阻止以gif|jpg|png 结尾的URL 
如果对这种盗链你是坚决鄙视的,你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ 你的图片地址 [R=301,L] 
除了阻止图片盗链链接,以上规则将其盗链的图片全部替换成了你设置的图片。 
你还可以阻止特定域名盗链你的图片: 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F,L]
这个规则将阻止域名黑名单上所有的图片链接请求。 
当然以上这些规则都是以{HTTP_REFERER}获取域名为基础的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。


5.如果文件不存在重定向到404页面 
如果你的主机没有提供404页面重定向服务,那么我们自己创建。 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .? /404.php [L] 
这里-f匹配的是存在的文件名,-d匹配的存在的路径名。这段代码在进行404重定向之前,会判断你的文件名以及路径名是否存在。你还可以在404页面上加一个?url=$1参数: 
RewriteRule ^/?(.*)$ /404.php?url=$1 [L]
这样,你的404页面就可以做一些其他的事情,例如默认信心,发一个邮件提醒,加一个搜索,等等。


6.重命名目录
如果你想在网站上重命名目录,试试这个: 
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
在规则里我添加了一个“.”(注意不是代表得所有字符,前面有转义符)来匹配文件的后缀名。 


7.将.html后缀名转换成.php
前提是.html文件能继续访问的情况下,更新你的网站链接。 
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]
这不是一个网页重定向,所以访问者是不可见的。让他作为一个永久重定向(可见的),将FLAG修改[R=301,L]。 


8.创建无文件后缀名链接
如果你想使你的PHP网站的链接更加简洁易记-或者隐藏文件的后缀名,试试这个: 
RewriteRule ^/?([a-z]+)$ $1.php [L]
如果网站混有PHP以及HTML文件,你可以用RewriteCond先判断该后缀的文件是否存在,然后进行替换: 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L]
如果文件是以.php为后缀,这条规则将被执行。


9.检查查询变量里的特定参数
如果在URL里面有一个特殊的参数,你可用RewriteCond鉴别其是否存在: 
RewriteCond %{QUERY_STRING} !uniquekey= 
RewriteRule ^/?script_that_requires_uniquekey\.php$ other_script.php [QSA,L]
以上规则将检查{QUERY_STRING}里面的uniquekey参数是否存在,如果{REQUEST_URI}值为script_that_requires_uniquekey,将会定向到新的URL。 


10.删除查询变量
Apache的mod_rewrite模块会自动辨识查询变量,除非你做了以下改动: 
a).分配一个新的查询参数(你可以用[QSA,L]FLAG保存最初的查询变量) 
b).在文件名后面加一个“?”(比如index.php?)。符号“?”不会在浏览器的地址栏里显示。


11.用新的格式展示当前URI 
如果这就是我们当前正在运行的URLs:/index.php?id=nnnn。我们非常希望将其更改成/nnnn并且让搜索引擎以新格式展现。首先,我们为了让搜索引擎更新成新的,得将旧的URLs重定向到新的格式,但是,我们还得保证以前的index.php照样能够运行。是不是被我搞迷糊了? 
实现以上功能,诀窍就在于在查询变量中加了一个访问者看不到的标记符“marker”。我们只将查询变量中没有出现“marker”标记的链接进行重定向,然后将原有的链接替换成新的格式,并且通过[QSA]FLAG在已有的参数加一个“marker”标记。以下为实现的方式: 
RewriteCond %{QUERY_STRING} !marker 
RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+) 
RewriteRule ^/?index\.php$ %1? [R=301,L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?marker &id=$1 [L]
这里,原先的URL:http://www.example.com/index.php?id=nnnn,不包含marker,所以被第一个规则永久重定向到http://www.example.com/nnnn,第二个规则将http://www.example.com/nnnn反定向到http://www.example.com/index.php?marker &id=nnnn,并且加了marker以及id=nnnn两个变量,最后mod_rewrite就开始进行处理过程。
第二次匹配,marker被匹配,所以忽略第一条规则,这里有一个“.”字符会出现在http://www.example.com/index.php?marker &id=nnnn中,所以第二条规则也会被忽略,这样我们就完成了。
注意,这个解决方案要求Apache的一些扩展功能,所以如果你的网站放于在共享主机中会遇到很多障碍。


12.保证安全服务启用
Apache可以用两种方法辨别你是否开启了安全服务,分别引用{HTTPS}和{SERVER_PORT}变量: 
RewriteCond %{REQUEST_URI} ^secure_page\.php$ 
RewriteCond %{HTTPS} !on 
RewriteRule ^/?(secure_page\.php)$ https://www.xzhuji.com/$1 [R=301,L]
以上规则测试{REQUEST_URI}值是否等于我们的安全页代码,并且{HTTPS}不等于on。如果这两个条件同时满足,请求将被重定向到安全服务URI.另外你可用{SERVER_PORT}做同样的测试,443是常用的安全服务端口 
RewriteCond %{REQUEST_URI} ^secure_page\.php$ 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(secure_page\.php)$ https://www.xzhuji.com/$1 [R=301,L]


13.在特定的页面上强制执行安全服务 
遇到同一个服务器根目录下分别有一个安全服务域名和一个非安全服务域名,所以你就需要用RewriteCond 判断安全服务端口是否占用,并且只将以下列表的页面要求为安全服务: 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www.xzhuji.com/%1 [R=301,L] 
以下是怎样将没有设置成安全服务的页面返回到80端口: 
RewriteCond %{ SERVER_PORT } ^443$ 
RewriteRule !^/?(page6|page7|page8|page9)$ xzhuji.com%{REQUEST_URI} [R=301,L]


来自  https://blog.csdn.net/qikexun/article/details/50896163


Apache htaccess 中的RewriteCond 规则介绍 (转)

apache 模块mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
 
 
此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(. htaccess )配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。
这里着重介绍一下RewriteCond 的规则以及参数说明。RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件(TestString能够与CondPattern匹配)时才会起作用。
【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]
【作用域】server config, virtual host, directory, .htaccess
【覆盖项】FileInfo
【状态】 扩展(E)
【模块】mod_rewrite
TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
RewriteRule反向引用 ,引用方法是:$N (0 <= N <= 9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern匹配的分组成分(圆括号!)。
RewriteCond反向引用 ,引用方法是:%N (1 <= N <= 9)引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
RewriteMap扩展 ,引用方法是:${mapname:key|default} 细节请参见RewriteMap指令。
服务器变量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE可以是下表列出的字符串之一:
HTTP头连接与请求   
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT     REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE 
服务器自身    日期和时间    其它
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE   TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME      API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
 
这些变量都对应于类似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,其中的大多数在其他的手册或者CGI规范中都有说明。 其中为mod_rewrite所特有的变量如下:
IS_SUBREQ
如果正在处理的请求是一个子请求,它将包含字符串”true”,否则就是”false”。模块为了解析URI中的附加文件,可能会产生子请求。
API_VERSION
这是正在使用中的Apache模块API(服务器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。此模块API版本对应于正在使用的Apache的版本(比如在Apache 1.3.14的发行版中这个值是19990320:10)。通常,对它感兴趣的是模块的开发者。
THE_REQUEST
这是由浏览器发送的完整的HTTP请求行(比如:”GET /index.html HTTP/1.1″)。 它不包含任何浏览器发送的其它头信息。
REQUEST_URI
这是在HTTP请求行中所请求的资源(比如上述例子中的”/index.html”)。
REQUEST_FILENAME
这是与请求相匹配的完整的本地文件系统的文件路径名。
HTTPS
如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl 是否已经加载,该变量都可以安全的使用)。
 
其它注意事项:
SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的filename字段。第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。
特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。
特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl 模块是否已经加载都可以使用(未加载时为空字符串)。比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。它总是可以通过查找HTTP请求而得到。比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后确定。当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写,就必须使用%{LA-U:REMOTE_USER}。 因为此变量是由URL重写(mod??_rewrite)步骤之后的认证步骤设置的。但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的,而认证步骤先于API修正步骤,所以可以用%{REMOTE_USER}。
预设形式:%{LA-F:variable} ,variable的最终值在执行一个内部(基于文件名的)子请求后确定。大多数情况下和上述的LA-U是相同的。
 
CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。
注意:CondPattern是一个perl兼容的正则表达式,但是还有若干增补:
1、可以在CondPattern串的开头使用’!'(惊叹号)来指定 不匹配 。
2、CondPatterns有若干特殊的变种。 除了正则表达式的标准用法,还有下列用法:
‘<CondPattern ‘(词典顺序的小于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString小于CondPattern则为真。
‘>CondPattern ‘(词典顺序的大于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString大于CondPattern则为真。
‘=CondPattern ‘(词典顺序的等于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。如果CondPattern是”"(两个双引号),则TestString将与空字符串进行比较。
‘-d ‘(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
‘-f ‘(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
‘-s ‘(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
‘-l ‘(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
‘-x ‘(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。 该权限由操作系统检测。
‘-F ‘(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
‘-U ‘(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
注意: 所有这些测试都可以用惊叹号作前缀(‘!’)以实现测试条件的反转。
3、还可以在CondPattern之后追加特殊的标记[flags] 作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:
‘nocase|NC ‘(忽略大小写)
它使测试忽略大小写,扩展后的TestString和CondPattern中’AZ’ 和’a-z’是没有区别的。此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。
‘ornext|OR ‘(或下一条件)
它以OR方式组合若干规则的条件,而不是隐含的AND。 典型的例子如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule …针对这3个主机的规则集…如果不用这个标记,你就必须要书写三次条件/规则对。
举例
如果要按请求头中的”User-Agent:”重写一个站点的主页,可以这样写:
RewriteCond % { HTTP_USER_AGENT }  ^Mozilla.* RewriteRule ^/$ /homepage. max .html  [ L ]
 
RewriteCond % { HTTP_USER_AGENT }  ^Lynx.* RewriteRule ^/$ /homepage. min .html  [ L ]
 
RewriteRule ^/$ /homepage .std.html  [ L ]
解释:
如果你使用的浏览器识别标志是’Mozilla’,则你将得到内容最大化的主页(含有Frames等等)。
如果你使用的是(基于终端的)Lynx, 则你得到的是内容最小化的主页(不含table等等)。
如果上述条件都不满足(使用的是其他浏览器),则你得到的是一个标准的主页。

来自  https://www.cnblogs.com/zhang36/p/6186004.html

普通分类: