变量捕获mod_rewrite

时间:2012-08-09 03:54:01

标签: asp.net .htaccess web-applications mod-rewrite

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

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的新手,所以任何帮助都会受到赞赏。

谢谢,
Ĵ

1 个答案:

答案 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://开头的结果,否则会在内部重写。