我有两个主机名(例如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]
这是一个正确的规则用于这项工作吗?如果是,是否有任何效率优化我应该考虑?
答案 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}
。