0

基本上,我一直在为网站迁移安排多个重定向。但是,在我的工作中,我们有多个服务器用于测试/开发/生产。域通常映射如下:

http://<accountname>.(test|dev|).<maindomain>.edu.au

对于内部重定向,维护对适当服务器的引用没有问题。但是,当我们在站点上执行迁移到另一个帐户时,要确保重定向保留在适当的服务器上变得有点困难。

例如,假设我们决定将“foo”帐户重定向到“bar”,用于我的公司名为“foobar”。

Foo's production URL:  http://foo.foobar.edu.au
Foo's test URL:        http://foo.test.foobar.edu.au
Foo's development URL: http://foo.dev.foobar.edu.au

Bar's production URL:  http://bar.foobar.edu.au
Bar's test URL:        http://bar.test.foobar.edu.au
Bar's development URL: http://bar.dev.foobar.edu.au

基本上我需要编写 htaccess 文件,以便所有请求foo都正确映射到bartest/dev/production域。

我目前实现这一点的方法是使用 RewriteCond 并捕获一些用于重定向的服务器信息:

RewriteCond %{SERVER_NAME} ^foo(\.test|\.dev|\.)foobar.edu.au
    RewriteRule ^(.*)$ http://bar%1foobar.edu.au/$1

这适用于批量重定向。但是,当我需要稍微花哨一点时(即,并非所有foo' 目录都匹配完全相同的路径bar并需要单独的重定向),我发现我需要RewriteCond为每个新目录复制相同的RewriteRule内容(因为您不能将 aRewriteCond应用于多个RewriteRule,同时仍在捕获数据。

例如:

# resources/data has been duplicated on bar
RewriteCond %{SERVER_NAME} ^foo(\.test\.|\.dev\.|\.)foobar.edu.au
    RewriteRule ^(resources/data/.+)$ http://bar%1foobar.edu.au/$1 [R=301,L]
# the rest of foo just points to a static page on bar
RewriteCond %{SERVER_NAME} ^foo(\.test\.|\.dev\.|\.)foobar.edu.au
    RewriteRule ^ http://bar%1foobar.edu.au/migration/foo.cfm [R=301,L]
# there are actually more, but removed for brevity

TL;DR
有没有一种直接的方法来捕获SERVER_PATH变量的一部分并在多个RewriteRule's 中使用它?

我是 mod_rewrite 的新手,所以任何帮助都将不胜感激。

谢谢,
J

4

1 回答 1

0

是否有一种直接的方法来捕获 SERVER_PATH 变量的一部分并在多个 RewriteRule 中使用它?

我认为除了复制匹配并在每次需要使用它时使用反向引用之外别无他法。但是,如果你把它交给一个,这会更容易RewriteMap吗?

可能类似于(这必须在您的虚拟主机或服务器配置中):

RewriteMap mymap prg:/path/to/my/mapping/script.sh

然后在您的 htaccess 中,您可以像这样调用它:

RewriteRule ^(.*)$ ${mymap:%{SERVER_NAME}%{REQUEST_URI}|$1} [L]

因此,您的 script.sh 需要采用%{SERVER_NAME}%{REQUEST_URI}(理论上类似于:)foo.test.foobar.edu.au/some/path/to/file.html并确定它需要去哪里。如果您需要重定向浏览器,请输出以开头的结果,http://否则它将在内部重写。

于 2012-08-09T04:05:17.210 回答