基本上,我一直在为工作迁移安排多个重定向。但是,在我的工作中,我们有多个服务器用于测试/开发/生产。域通常映射如下:
http://<accountname>.(test|dev|).<maindomain>.edu.au
对于内部重定向,维护对相应服务器的引用没有问题。但是,当我们执行迁移到站点上的另一个帐户时,确保重定向保留在适当的服务器上会变得有点困难。
例如,假设我们决定将“foo”帐户重定向到我公司名为“foobar”的“bar”。
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
的所有请求都适当地映射到bar
的{{1}}域。
目前我实现此目的的方法是使用RewriteCond并捕获重定向的一些服务器信息:
test/dev/production
哪个适用于批量重定向。但是,当我需要稍微更加花哨时(即并非所有RewriteCond %{SERVER_NAME} ^foo(\.test|\.dev|\.)foobar.edu.au
RewriteRule ^(.*)$ http://bar%1foobar.edu.au/$1
的目录都匹配foo
上的完全相同的路径并且需要单独的重定向),我发现我需要复制相同的{{ 1}}用于每个新bar
(因为在仍然捕获数据时,您无法将RewriteCond
应用于多个RewriteRule
。
例如:
RewriteCond
TL; DR
是否有一种直接的方法来捕获 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
中使用它?
我是mod_rewrite的新手,所以任何帮助都会受到赞赏。
谢谢,
Ĵ
答案 0 :(得分:0)
是否有一种直接的方法来捕获SERVER_PATH变量的一部分并在多个RewriteRule中使用它?
我不认为除了重复匹配以及每次需要使用反向引用时都有其他方法。但是,如果你将它移交给RewriteMap
,这会更容易吗?
可能类似(这必须在你的vhost或服务器配置中):
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://
开头的结果,否则会在内部重写。