代码之家  ›  专栏  ›  技术社区  ›  Justin Grant

apache mod_重写主机名之间的重定向(除了一个目录)

  •  1
  • Justin Grant  · 技术社区  · 14 年前

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

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

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

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   Tim Stone    14 年前

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

    RewriteCond %{HTTP_METHOD} !^POST [OR]
    

    如果请求类型为 邮政, 它是,请求的URI是 /Dontredirectme(Dontredirectme)/ ,这有效地导致将所有不是post请求的内容重定向到 /Dontredirectme(Dontredirectme)/ .

    此外,输入到 RewriteRule 如果在每个目录上下文(在.htaccess文件中或在 <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]
    

    我怀疑除了最极端的情况外,这种差异确实是可以理解的,但是这会删除两个正则表达式,从而有利于直接文本比较。此外,由于您只想将请求逐字重定向到新主机,因此可以“简化”包含在 改写词 只是使用 %{REQUEST_URI} 直接在更换中。