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

时间:2011-11-08 03:28:09

标签: wordpress .htaccess dns subdomain redirect

我有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设置了通配符子域。

  • 但我也为domain2.tld设置了一个通配符子域,只是为了确保domain2.tld上的所有子域都与domain1.tld的IP地址相同:我认为这些子域应该是可以在我的根文件夹中被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:subdm}domain1\.com\/ [L]

......但这只是平原打破了这两个领域。 :d

我对正则表达式比较熟练,因此我在使用HTACCESS时感觉很舒服,但实际上我对HTACCESS这个世界还很陌生。我需要另一双眼睛!

↓更新(2011-11-08美国东部时间上午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

1 个答案:

答案 0 :(得分:3)

你在%{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]