高级 HTACCESS 子域重定向(foo.dom2.com 到 foo.dom1.com)

Posted

技术标签:

【中文标题】高级 HTACCESS 子域重定向(foo.dom2.com 到 foo.dom1.com)【英文标题】:Advanced HTACCESS Subdomain Redirection (foo.dom2.com to foo.dom1.com) 【发布时间】:2011-12-24 03:23:03 【问题描述】:

我有 domain1.tld 和 domain2.tld。 Domain1.tld 是主域名,domain2.tld 只是一个别名。我已通过 HTACCESS 成功地将 domain2.tld 重定向到 domain1.tld,但我希望 domain2.tld 上的所有子域同样动态地重定向到 domain1.tld 上的并行子域。

例如:bla.domain2.tld 应该重定向到 bla.domain1.tld,foo.domain2.tld 应该重定向到 foo.domain1.tld。

这个解决方案需要是动态的,而不是硬编码到特定的子域。

哈哈,我想我写的是一个包罗万象的、一对一的、包含子域的、在 HTACCESS 中的别名域重定向脚本。

信息:

我在 Bluehost 上,无法访问 VHOSTS、HTTPD.CONF 等。

我有一个 Wordpress 子域网络(多站点)。这意味着我的 domain1.tld 子域是虚拟的。 Wordpress 会处理这个问题,所以只要我可以将 foo.domain2.tld 完全重定向到 foo.domain1.tld,Wordpress 就应该不那么明智并且可以正常工作。对吧?

Wordpress 有“专业领域映射”插件。这允许我网络上的站点拥有自己的域名。但目前的问题仅涉及我网络上的站点,这些站点没有自己的域名,因此使用了我的主域 (domain1.tld) 上的子域。

因此,我为 domain1.tld 设置了通配符子域。

1234563可以被我根文件夹中的 HTACCESS 读取。

这是我希望这样做的 HTACCESS 中的规则:

RewriteCond %HTTP_HOST ^(www\.)?([a-z0-9-]+\.)?domain2\.com$ [NC]
RewriteRule ^(www\.)?([a-z0-9-]+\.)?(.*) http\:\/\/%2domain1\.com\/ [L]

但这不起作用。我错过了什么?

我也尝试过使用环境变量,如下所示:

RewriteCond %HTTP_HOST ^(www\.)?[E=subdm:([a-z0-9-]+\.)]?domain2\.com [NC]
RewriteRule ^(.*) http\:\/\/%ENV:subdmdomain1\.com\/ [L]

...但这只是简单地破坏了两个域。 :D

我比较精通正则表达式,因此我使用 HTACCESS 是多么自在,但实际上我对 HTACCESS 世界还是很陌生。我需要另一双眼睛!

↓ 更新(美国东部时间 2011 年 11 月 8 日上午 9:33)↓

我尝试了 Jon Lin 建议的第一个解决方案,但不得不稍微修改一下。最初,它不会处理没有子域的 domain2.com,直到我将句点放在第二个匹配括号对中并在该对括号后面加上问号。

正如您在下面看到的,我已经继续提供了我的 HTACCESS 的全部内容,以防您发现某些内容存在冲突。

当前使用建议的 RewriteRule 正确重定向:www.domain2.com、domain2.com 和 domain2.com/foo 目前不使用建议的 RewriteRule 重定向:foo.domain2.com

# Use php5 Single php.ini as default
AddHandler application/x-httpd-php5s .php

Options +SymLinksIfOwnerMatch
RewriteEngine on

RewriteCond %HTTP_HOST ^(www\.)?([^\.]+\.)?domain2\.com$ [NC]
RewriteRule ^(.*)$ http\:\/\/%2domain1\.com\/$1 [L,R]

# BEGIN WordPress
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]

RewriteCond %REQUEST_FILENAME -f [OR]
RewriteCond %REQUEST_FILENAME -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
# END WordPress

【问题讨论】:

不确定该规则有什么问题,当我使用您的 .htaccess 时,foo.domain2.com 到 foo.domain1.com 的重定向工作正常 【参考方案1】:

您在 %HTTP_HOST 的正确轨道上,但您需要使用反向引用(%1、%2 等)来访问与它的匹配项。你想做这样的事情:

RewriteCond %HTTP_HOST ^(www\.)?([^\.]+)\.domain2\.com$ [NC]
RewriteRule ^(.*)$ http://%2.domain1.com/$1  [L,R]

请注意,如果您尝试访问:http://www.sub.domain2.com/foo,它会将您重定向到 http://sub.domain1.com/foo,即“www”。原来的请求消失了。如果您想要 www,请将规则更改为:

RewriteRule ^(.*)$ http://%1%2.domain1.com/$1  [L,R]

【讨论】:

好的,所以在您提供的第一个 RewriteRule 中,解释为什么使用百分号来表示变量 %2,而在 $1 中使用 $。很难找到对 HTACCESS 语法的体面解释。 RewriteRule 的左侧是引用完整 URL 还是仅引用路径? 我已经更新了我的问题。子域是 URL 中唯一没有使用您提供的 RewriteRule 正确重定向的部分。 %1, %2, %3 反向引用与前一个 RewriteCond 中的引用匹配,而不是当前 RewriteRule 中的匹配项

以上是关于高级 HTACCESS 子域重定向(foo.dom2.com 到 foo.dom1.com)的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 重定向到子域

.htaccess 如何仅将子域/文件夹重定向到子域

不要在 htaccess 中重定向子域

.htaccess 重定向影响子域

.htaccess 重定向 - 自动添加 www。如果不存在子域

.htaccess:将主域重定向到https:// www,子域重定向到https://(不带www)