<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LAVA WORLD &#187; 重写</title>
	<atom:link href="http://www.vpnall.com/tag/%e9%87%8d%e5%86%99/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vpnall.com</link>
	<description>又一个森林Q群:52130297(IT聊天群)</description>
	<lastBuildDate>Fri, 03 Sep 2010 06:42:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>RewriteRule重写规则的语法：Apache的Mod_rewrite</title>
		<link>http://www.vpnall.com/2010/03/rewriterule%e9%87%8d%e5%86%99%e8%a7%84%e5%88%99%e7%9a%84%e8%af%ad%e6%b3%95%ef%bc%9aapache%e7%9a%84mod_rewrite/</link>
		<comments>http://www.vpnall.com/2010/03/rewriterule%e9%87%8d%e5%86%99%e8%a7%84%e5%88%99%e7%9a%84%e8%af%ad%e6%b3%95%ef%bc%9aapache%e7%9a%84mod_rewrite/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 05:58:44 +0000</pubDate>
		<dc:creator>lava</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Mod_rewrite]]></category>
		<category><![CDATA[RewriteRule]]></category>
		<category><![CDATA[重写]]></category>

		<guid isPermaLink="false">http://www.vpnall.com/?p=683</guid>
		<description><![CDATA[很少用,有人问,顺便看了一下
一条RewriteRule指令，定义一条重写规则，规则间的顺序非常重要。对Apache1.2及以后的版本，模板(pattern)是一个POSIX正则式，用以匹配当前的URL。当前的URL不一定是用... ]]></description>
			<content:encoded><![CDATA[<p>很少用,有人问,顺便看了一下</p>
<p>一条RewriteRule指令，定义一条重写规则，规则间的顺序非常重要。对Apache1.2及以后的版本，模板(pattern)是一个POSIX正则式，用以匹配当前的URL。当前的URL不一定是用记最初提交的URL，因为可能用一些规则在此规则前已经对URL进行了处理。<br />
对mod_rewrite来说，！是个合法的模板前缀，表示“非”的意思，这对描述“不满足某种匹配条件”的情况非常方便，或用作最后一条默认规则。当使用！时，不能在模板中有分组的通配符，也不能做后向引用。<br />
当匹配成功后，Substitution会被用来替换相应的匹配，它除了可以是普通的字符串以外，还可以包括：<br />
1. $N,引用RewriteRule模板中匹配的相关字串，N表示序号,N=0..9<br />
2. %N,引用最后一个RewriteCond模板中匹配的数据，N表示序号<br />
3. %{VARNAME},服务器变量<br />
4. ${mapname:key|default},映射函数调用<br />
这些特殊内容的扩展，按上述顺序进行。<br />
一个URL的全部相关部分都会被Substitution替换，而且这个替换过程会一直持续到所有的规则都被执行完，除非明确地用L标志中断处理过程。<br />
当susbstitution有”-”前缀时，表示不进行替换，只做匹配检查。<br />
利用RewriteRule，可定义含有请求串(Query String)的URL，此时只需在Sustitution中加入一个？，表示此后的内容放入QUERY_STRING变量中。如果要清空一个QUERY_STRING变量，只需要以？结束Substitution串即可。<br />
如果给一个Substitution增加一个</p>
<p><span style="font-family: Verdana; font-size: x-small;"><br />
1. &#8217;redirect|R [=code]&#8216; (强制重定向)<br />
给当前的URI增加前缀</p>
<p><span style="font-family: Verdana; font-size: x-small;"><br />
2. &#8217;forbidden|F&#8217; (强制禁止访问URL所指的资源)<br />
立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用，可以阻断访问某些URL。<br />
3. &#8217;gone|G&#8217; (强制返回URL所指资源为不存在(gone))<br />
立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.<br />
4. # &#8216;proxy|P&#8217; (强制将当前URL送往代理模块（proxy module）)<br />
这个标志，强制将substitution当作一个发向代理模块的请求，并立即将共送往代理模块。因此，必须确保substitution串是一个合法的URI (如, 典型的情况是以</p>
<p><span style="font-family: Verdana; font-size: x-small;"><br />
5. &#8217;last|L&#8217; (最后一条规则)<br />
中止重写流程，不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。<br />
6. &#8217;next|N&#8217; (下一轮)<br />
重新从第一条重写规则开始执行重写过程，新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。<br />
7. # &#8216;chain|C&#8217; (将当前的规则与其后续规则綑绑(chained))<br />
当规则匹配时，处理过程与没有綑绑一样；如果规则不匹配，则綑绑在一起的后续规则也不在检查和执行。<br />
8. &#8217;type|T=MIME-type&#8217; (强制MIME类型)<br />
强制将目标文件的MIME-type为某MIME类型。例如，这可用来模仿mod_alias模块对某目录的ScriptAlias指定，通过强制将该目录下的所有文件的类型改为 “application/x-httpd-cgi”.<br />
9. &#8217;nosubreq|NS&#8217; (used only if no internal sub-request )<br />
这个标志强制重写引擎跳过为内部sub-request的重写规则.例如，当mod_include试图找到某一目录下的默认文件时 (index.xxx)，sub-requests 会在Apache内部发生. Sub-requests并非总是有用的，在某些情况下如果整个规则集施加到它上面，会产生错误。利用这个标志可排除执行一些规则。<br />
10. &#8217;nocase|NC&#8217; (模板不区分大小写)</p>
<p>这个标志会使得模板匹配当前URL时忽略大小写的差别。<br />
11. &#8217;qsappend|QSA&#8217; (追加请求串(query string))<br />
这个标志，强制重写引擎为Substitution的请求串追加一部分串，则不是替换掉原来的。借助这个标志，可以使用一个重写规则给请求串增加更多的数据。<br />
12. &#8217;noescape|NE&#8217; (不对输出结果中的特殊字符进行转义处理)<br />
通常情况下，mod_write的输出结果中，特殊字符（如&#8217;%', &#8216;$&#8217;, &#8216;;&#8217;, 等)会转义为它们的16进制形式(如分别为&#8217;%25&#8242;, &#8216;%24&#8242;, and &#8216;%3B&#8217;）。这个标志会禁止mod_rewrite对输出结果进行此类操作。 这个标志只能在 Apache 1.3.20及以后的版本中使用。<br />
13. &#8217;passthrough|PT&#8217; (通过下一个处理器)<br />
这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值。. 使用这个标志，可以使后续的其它URI－to-filename转换器的Alias、ScriptAlias、Redirect等指令，也能正常处理RewriteRule指令的输出结果。用一个小例子来说明它的语义：如果要用mod_rewrite的重写引擎将/abc转换为/def,然后用mod_alas将/def重写为ghi，则要：<br />
RewriteRule ^/abc(.*) /def$1 [PT]<br />
Alias /def /ghi<br />
如果PT标志被忽略，则mod_rewrite也能很好完成工作,如果., 将 uri=/abc/&#8230; 转换为filename=/def/&#8230; ，完全符合一个URI-to-filename转换器的动作。接下来 mod_alias 试图做 URI-to-filename 转换时就会出问题。<br />
注意:如果要混合都含有URL－to-filename转换器的不同的模块的指令，必须用这个标志。最典型的例子是mod_alias和mod_rewrite的使用。<br />
14. &#8217;skip|S=num&#8217; (跳过后面的num个规则)<br />
当前规则匹配时，强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构：then子句的最后一条rule的标志是skip=N，而N是else子句的规则条数。<br />
15. &#8217;env|E=VAR:VAL&#8217; (设置环境变量)<br />
设置名为VAR的环境变量的值为VAL,其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次，以设置多个环境变量。这儿设置的变量，可以在多种情况下被引用，如在XSSI或CGI中。另外，也可以在RewriteCond模板中以%{ENV:VAR}的形式被引用。<br />
16.</p>
<p><span style="font-family: Verdana; font-size: x-small;"> 注意：一定不要忘记，在服务器范围内的配置文件中，模板(pattern)用以匹配整个URL;而在目录范围内的配置文件中，目录前缀总是被自动去掉后再进行模板匹配的，且在替换完成后自动再加上这个前缀。这个功能对很多种类的重写是非常重要的，因为如果没有去前缀，则要进行父目录的匹配，而父目录的信息并不是总能得到的。一个例外是，当substitution中有http://打头时，则不再自动增加前缀了，如果P标志出现，则会强制转向代理。<br />
</span></p>
<p><span style="font-family: Verdana; font-size: x-small;">注意：如果要在某个目录范围内启动重写引擎，则需要在相应的目录配置文件中设置“RewriteEngine on”，且目录的“Options FollowSymLinks”必须设置。如果管理员由于安全原因没有打开FollowSymLinks，则不能使用重写引擎。</span></p>
<p></span></span></span></p>
<p><span style="font-family: Verdana; font-size: x-small;">http://hostname</span><span style="font-family: Verdana; font-size: x-small;">开头)，否则会从代理模块得到一个错误. 这个标志，是ProxyPass指令的一个更强劲的实现，将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。<br />
注意，使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令，来检查输出中是否含有mod_proxy.c来确认一下。如果没有，而又需要使用这个功能，则需要重新编译&#8220;httpd&#8221;程序并使用mod_proxy有效。</span><span style="font-family: Verdana; font-size: x-small;">http://thishost[:thisport]/</span><span style="font-family: Verdana; font-size: x-small;">， 从而生成一个新的URL，强制生成一个外部重定向(external redirection，指生的URL发送到客户端，由客户端再次以新的URL发出请求，虽然新URL仍指向当前的服务器). 如果没有指定的code值，则HTTP应答以状态值302 (MOVED TEMPORARILY)，如果想使用300-400（不含400）间的其它值可以通过在code的位置以相应的数字指定，也可以用标志名指定： temp (默认值), permanent, seeother.</span></p>
<p><span style="font-family: Verdana; font-size: x-small;">注意，当使用这个标志时，要确实substitution是个合法的URL，这个标志只是在URL前增加<span style="font-family: Verdana; font-size: x-small;">http://thishost[:thisport]/</span><span style="font-family: Verdana; font-size: x-small;">前缀而已，重写操作会继续进行。如果要立即将新URL重定向，用L标志来中重写流程。 </span><span style="font-family: Verdana; font-size: x-small;">http://thishost[:port</span><span style="font-family: Verdana; font-size: x-small;">]的前缀，则mod_rewrite会自动将此前缀去掉。因此，利用</span><span style="font-family: Verdana; font-size: x-small;">http://thisthost</span><span style="font-family: Verdana; font-size: x-small;">做一个无条件的重定向到自己，将难以奏效。要实现这种效果，必须使用R标志。<br />
Flags是可选参数，当有多个标志同时出现时，彼此间以逗号分隔。</span></span></p>

	标签：<a href="http://www.vpnall.com/tag/apache/" title="apache" rel="tag">apache</a>, <a href="http://www.vpnall.com/tag/mod_rewrite/" title="Mod_rewrite" rel="tag">Mod_rewrite</a>, <a href="http://www.vpnall.com/tag/rewriterule/" title="RewriteRule" rel="tag">RewriteRule</a>, <a href="http://www.vpnall.com/tag/%e9%87%8d%e5%86%99/" title="重写" rel="tag">重写</a><br />

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.vpnall.com/2010/01/%e8%a7%a3%e5%86%b3apache%e5%90%af%e5%8a%a8-os-10022%e6%8f%90%e4%be%9b%e4%ba%86%e4%b8%80%e4%b8%aa%e6%97%a0%e6%95%88%e7%9a%84%e5%8f%82%e6%95%b0/" title="解决Apache启动 (OS 10022)提供了一个无效的参数 (2010-01-25)">解决Apache启动 (OS 10022)提供了一个无效的参数</a> (0)</li>
	<li><a href="http://www.vpnall.com/2009/03/nginx_apache_mysql_php_memcached_squid/" title="[转]利用nginx+apache+mysql+php+memcached+squid搭建门户网站 (2009-03-09)">[转]利用nginx+apache+mysql+php+memcached+squid搭建门户网站</a> (0)</li>
	<li><a href="http://www.vpnall.com/2010/03/centos%e4%b8%8ayum%e5%ae%89%e8%a3%85apachephpmysqlphpmyadmin/" title="Centos上YUM安装Apache+php+Mysql+phpMyAdmin (2010-03-10)">Centos上YUM安装Apache+php+Mysql+phpMyAdmin</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.vpnall.com/2010/03/rewriterule%e9%87%8d%e5%86%99%e8%a7%84%e5%88%99%e7%9a%84%e8%af%ad%e6%b3%95%ef%bc%9aapache%e7%9a%84mod_rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
