2010-09-30 31 views
1

我有两个主机名(例如www.site1.com和www.site2.com)映射到同一个apache虚拟主机。我希望将来自site1.com的所有流量重定向到site2.com,,但对于来自特定文件夹的所有POST请求,除之外。 (该文件夹包含旧版客户端使用的URL,这些URL无法处理POST请求中的重定向。)apache mod_rewrite主机名之间的重定向(除了一个目录)

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

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

这是一个正确的规则,用于这项工作?如果是的话,我应该考虑哪些效率优化?

回答

2

规则集看起来比较正确的,但你需要修改你的第二个RewriteCond一点点地反映你的目标:

RewriteCond %{HTTP_METHOD} !^POST [OR] 

这将允许您如果请求类型是 POST重定向,它是与所请求的URI是不/dontredirectme/,这有效地导致了一切重定向不是POST请求/dontredirectme/

此外,如果要在每个目录上下文(在.htaccess文件或<Directory>部分中)中定义它,RewriteRule的输入不会有前导斜杠。如果您直接在<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}

+0

很好的答案。正是我所期待的。 – 2010-10-01 22:53:03

相关问题