首页 文章

变量捕获mod_rewrite

提问于
浏览
0

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

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 的所有请求都适当地映射到 bartest/dev/production 域 .

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

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

哪个适用于批量重定向 . 但是,当我需要稍微更加花哨时(即 foo 的所有目录都不匹配 bar 上的完全相同的路径并需要单独的重定向),我发现我需要为每个新的 RewriteRule 复制相同的 RewriteCond (因为你可以'在仍然捕获数据的同时将 RewriteCond 应用于多个 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 中使用它?

我是mod_rewrite的新手,所以任何帮助都会受到赞赏 .

谢谢,
Ĵ

1 回答

  • 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:// 开头的结果,否则将在内部重写 .

相关问题