htaccess使用通配符和多个子域重写

时间:2012-07-27 19:02:26

标签: .htaccess rewrite wildcard subdomain

我想使用单个域在单个虚拟主机上实现TEST,CERT和PROD网页。 这些网站正在使用通配符作为第一个子域名。

我有以下代码:

# for TEST
RewriteCond %{HTTP_HOST} (.*).test.domain.com
RewriteCond %{REQUEST_URI} !^/directory3
RewriteRule ^(.*)$ /directory3/$1 [L]

# for CERT
RewriteCond %{HTTP_HOST} (.*).cert.domain.com
RewriteCond %{REQUEST_URI} !^/directory2
RewriteRule ^(.*)$ /directory2/$1 [L]

# for PROD
RewriteCond %{HTTP_HOST} (.*).domain.com
RewriteCond %{REQUEST_URI} !^/directory1
RewriteRule ^(.*)$ /directory1/$1 [L]

这有三个问题:
1)在浏览器地址栏中更改了网址,以便用户可以看到新网址。 我希望用户看到原始类型的URL
显示:

http:\\subdomain1.cert.com\directory2

而不是:

http:\\subdomain1.cert.com

2) TEST和CERT Rewrite的Internal Server Error
当我替换固定子域的通配符

时,它工作正常

3) PROD RweriteCond始终有效(也适用于CERT和TEST子。这意味着它始终转发到directory1

1 个答案:

答案 0 :(得分:1)

这些规则互相干扰。因为主机:(.*).domain.com也匹配cert和测试主机。您需要在“PROD”规则中排除它们:

RewriteCond %{HTTP_HOST} !test.domain.com
RewriteCond %{HTTP_HOST} !cert.domain.com
RewriteCond %{HTTP_HOST} (.*).domain.com
RewriteCond %{REQUEST_URI} !^/directory1
RewriteRule ^(.*)$ /directory1/$1 [L]

这解决了#2和#3。至于重定向,这是其他的东西,除非目标中有http://或方括号中有R标记,否则这些规则不会重定向浏览器。