apache mod_rewrite主机名之间的重定向(一个目录除外)

时间:2010-09-30 16:57:08

标签: apache mod-rewrite url-rewriting

我有两个主机名(例如www.site1.com和www.site2.com)映射到同一个apache虚拟主机。对于来自特定文件夹的所有POST请求,我想将所有流量从site1.com重定向到site2.com, 。 (该文件夹包含旧客户端使用的URL,这些客户端无法处理POST请求上的重定向。)

这是我提出的规则。我是一个重写规则的新手,所以想确保我没有遗漏任何明显的东西。

RewriteCond %{HTTP_HOST} ^www.site1.com$
RewriteCond %{HTTP_METHOD} ^POST
RewriteCond %{REQUEST_URI} !^/dontredirectme/
RewriteRule /(.*) http://www.site2.com/$1 [R=301,L]

这是一个正确的规则用于这项工作吗?如果是,是否有任何效率优化我应该考虑?

1 个答案:

答案 0 :(得分:2)

您的规则集看起来相对正确,但您需要稍微修改第二个RewriteCond以反映您的目标:

RewriteCond %{HTTP_METHOD} !^POST [OR]

如果请求类型 POST,,并且请求的URI ,则可以重定向/ dontredirectme / ,这有效地导致重定向所有不是对 / dontredirectme / 的POST请求。

此外,如果您在每个目录上下文(在.htaccess文件或RewriteRule部分中)定义,<Directory>的输入将没有前导斜杠。如果您直接在<VirtualHost>(每服务器上下文)中定义它,那么输入将有一个前导斜杠,因此您的规则就可以了。

就效率而言,服务器配置中定义的规则只需要解析一次。另一方面,必须为每个请求解析.htaccess文件,这个过程涉及读取文件和编译正则表达式的额外(虽然很小)开销。

如果您真的希望从中提高效率,可以进行以下更改:

RewriteCond %{HTTP_HOST}    =www.example.com
RewriteCond %{HTTP_METHOD} !=POST [NC,OR]
RewriteCond %{REQUEST_URI} !^/dontredirectme/
RewriteRule ^ http://www.example.net%{REQUEST_URI} [R=301,L]

我怀疑除了最极端的情况之外,差异是真的很明显,但这会删除两个正则表达式,支持直接文本比较。此外,由于您只想逐字地将请求重定向到新主机,因此您可以“简化”RewriteRule中涉及的正则表达式,并直接在替换中使用%{REQUEST_URI}