<?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>潘锦的空间 &#187; Apache mod_rewrite</title>
	<atom:link href="https://www.phppan.com/tag/apache-mod_rewrite/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sun, 12 Apr 2026 03:47:23 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>让Apache的URL rewrite支持post数据</title>
		<link>https://www.phppan.com/2009/08/apache-url-rewrite-post-data/</link>
		<comments>https://www.phppan.com/2009/08/apache-url-rewrite-post-data/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 01:18:11 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[Apache mod_rewrite]]></category>
		<category><![CDATA[post数据]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=148</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;今天要做项目升级，但是由于之前的某些原因，所有的代码都被重写了 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;今天要做项目升级，但是由于之前的某些原因，所有的代码都被重写了，而且新的代码在原有系统的/sub/目录已经试运行几个月了，有部分的地址已经被其它网站调用（包括GET方式和POST方式）。于是就得保证在根目录和/sub/目录都必须指向根目录。于是，就有了apache rewrite。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在切换之前测试目录指向是否有效，配置RewriteRule ^/sub/(.*)$ /$1 [R=301]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;GET方式没有问题，但是post的数据无法接收。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Google半天，没有找到原因，只有看官方文档，一个一个参数的去试，所幸，才试了两个就可以了，只要在最后添加【P】，即强制使用代理转发，配置：RewriteRule ^/sub/(.*)$ /$1 [R=301,P]。</p>
<p> <br />
【结论】<br />
&nbsp;&nbsp;&nbsp;&nbsp;Apache的URL Rewrite可以支持post数据，但是必须设置P，</p>
<p> <br />
【建议】<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于R标志，建议加上R=301，表示永久性跳转，对于SEO会好一些！</p>
<p>【Apache mod_rewrite规则重写的标志一览】<br />
R[=code](force redirect) 强制外部重定向</p>
<p>强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定，将用缺省的302 HTTP状态码。</p>
<p>F(force URL to be forbidden)禁用URL,返回403HTTP状态码。</p>
<p>G(force URL to be gone) 强制URL为GONE，返回410HTTP状态码。</p>
<p>P(force proxy) 强制使用代理转发。</p>
<p>L(last rule) 表明当前规则是最后一条规则，停止分析以后规则的重写。</p>
<p>N(next round) 重新从第一条规则开始运行重写过程。</p>
<p>C(chained with next rule) 与下一条规则关联</p>
<p>如果规则匹配则正常处理，该标志无效，如果不匹配，那么下面所有关联的规则都跳过。</p>
<p>T=MIME-type(force MIME type) 强制MIME类型</p>
<p>NS (used only if no internal sub-request) 只用于不是内部子请求</p>
<p>NC(no case) 不区分大小写</p>
<p>QSA(query string append) 追加请求字符串</p>
<p>NE(no URI escaping of output) 不在输出转义特殊字符</p>
<p>例如：RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed</p>
<p>PT(pass through to next handler) 传递给下一个处理</p>
<p>例如：</p>
<p>RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理</p>
<p>Alias /def /ghi</p>
<p>S=num(skip next rule(s)) 跳过num条规则</p>
<p>E=VAR:VAL(set environment variable) 设置环境变量</p>
<p> </p>
<p>使用mod_rewrite时常用的服务器变量：</p>
<p>HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT</p>
<p>connection &amp; request: REMOTE_ADDR, QUERY_STRING</p>
<p>server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL</p>
<p>system stuff: TIME_YEAR, TIME_MON, TIME_DAY</p>
<p> </p>
<p>RewriteRule规则表达式的说明：</p>
<p>    . 匹配任何单字符</p>
<p>    [chars] 匹配字符串:chars</p>
<p>    [^chars] 不匹配字符串:chars</p>
<p>    text1|text2 可选择的字符串:text1或text2</p>
<p>    ? 匹配0到1个字符</p>
<p>    * 匹配0到多个字符</p>
<p>    + 匹配1到多个字符</p>
<p>    ^ 字符串开始标志</p>
<p>    $ 字符串结束标志</p>
<p>    \n 转义符标志</p>
<p> </p>
<p>反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 &lt;= N &lt;= 9)</p>
<p>反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 &lt;= N &lt;= 9)</p>
<p> </p>
<p>RewriteCond适用的标志符</p>
<p>‘nocase|NC’ (no case)忽略大小</p>
<p>‘ornext|OR’ (or next condition)逻辑或，可以同时匹配多个RewriteCond条件</p>
<p> </p>
<p>RewriteRule适用的标志符</p>
<p>‘redirect|R [=code]’ (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如：[R=301,L]</p>
<p>‘forbidden|F’ (force URL to be forbidden)重写为禁止访问</p>
<p>‘proxy|P’ (force proxy)重写为通过代理访问的http路径</p>
<p>‘last|L’ (last rule)最后的重写规则标志，如果匹配，不再执行以后的规则</p>
<p>‘next|N’ (next round)循环同一个规则，直到不能满足匹配</p>
<p>‘chain|C’ (chained with next rule)如果匹配该规则，则继续下面的有Chain标志的规则。</p>
<p>‘type|T=MIME-type’ (force MIME type)指定MIME类型</p>
<p>‘nosubreq|NS’ (used only if no internal sub-request)如果是内部子请求则跳过</p>
<p>‘nocase|NC’ (no case)忽略大小</p>
<p>‘qsappend|QSA’ (query string append)附加查询字符串</p>
<p>‘noescape|NE’ (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。</p>
<p>‘passthrough|PT’ (pass through to next handler)将重写结果运用于mod_alias</p>
<p>‘skip|S=num’ (skip next rule(s))跳过下面几个规则</p>
<p>‘env|E=VAR:VAL’ (set environment variable)添加环境变量</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2009/08/apache-url-rewrite-post-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
