htaccess动态子域重写

时间:2012-07-16 14:47:02

标签: regex .htaccess mod-rewrite

我保证我一直在寻找答案的答案,但它仍然没有用。这就是我所拥有的:

RewriteCond %{HTTP_HOST} ^([^\.]*)\.example\.com [NC]
RewriteCond %{REQUEST_URI} !^/%1/ [NC]
RewriteRule ^(.*)$ /%1/$1 [L]

这会创建一个无限循环,因为第二行未正确匹配。但是,如果我将{2}中的%1替换为www并转到www.example.com,则可以正常使用。显然它不再适用于其他子域,但事实上,当我在第二行明确输入www而不是让%1处理它时,这很奇怪,因为我知道{{1是} %1

我想要完成的事情如下: 我有一个域名“example.com”。在根目录中有几个子目录,比如说“dev”,“test”和“www”。在我的htaccess文件中,如果子域为空(example.com),w(w.example.com)或ww(ww.example),我有一条强制域重定向到“www.example.com”的规则.com),其他任何东西都是独立的(dev.example.com,test.example.com)。现在,该文件的这一部分应该根据子域将请求重写到正确的子目录。因此,像“dev.example.com/something.jpg”这样的请求会被重写(不重定向)到“dev.example.com/dev/something.jpg”。

此处的计划是能够在服务器上创建开发和测试环境,而无需在我的主服务器上重新创建环境,确保所有服务器设置完全相同。此外,它可以做任何我希望它做的事情我想,但这是迫切的需要。

1 个答案:

答案 0 :(得分:1)

问题是你不能在RewriteCond的匹配表达式中使用反向引用变量。这没关系:

# ----------V
RewriteCond %1 <regex>

但这不是:

# -------------------------V
RewriteCond %{REQUEST_URI} %1

如果您需要执行此类匹配,则可以执行以下操作:使用匹配反向引用\1从同一正则表达式中访问匹配项。然后,您可以将%1后引用放在RewriteCond的左侧参数中,并使用\1进行匹配。像这样:

RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)[^:]*:\1 [NC]

所以%{REQUEST_URI}:%1位看起来像这样:/foo:subdomain^/([^/]+)[^:]*:\1不匹配,因为表达式在“strong”之后寻找 foo :“(\1 =”foo“)。因此规则得到应用,URI现在为/subdomain/foo,第二次%{REQUEST_URI}:%1变为/subdomain/foo:subdomain,这次正则表达式匹配,因为\1 =“subdomain”并且!使得不会应用规则。