1

我保证我已经在这里寻找了几个小时的答案,但它仍然没有工作。这是我所拥有的:

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

这会创建一个无限循环,因为第二行没有正确匹配。但是,如果我将%1第二行替换为wwwand go to www.example.com,它工作正常。显然它不再适用于其他子域,但是当我明确输入www第二行而不是让它%1照顾它时,这一事实很奇怪,因为我知道 is 的%1www

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

这里的计划是能够在服务器上创建开发和测试环境,而不必在我的家庭服务器上重新创建环境,确保所有服务器设置完全相同。此外,我想它可以做任何我想让它做的事情,但这是当务之急。

4

1 回答 1

1

问题是您不能在 a 的匹配表达式中使用反向引用变量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不会匹配,因为表达式在“:”(=“foo”)之后寻找foo 。\1所以规则被应用,URI 是 now /subdomain/foo,第二次%{REQUEST_URI}:%1变成/subdomain/foo:subdomain,这一次正则表达式匹配,因为\1= "subdomain" 并且!使得规则被应用。

于 2012-07-16T16:22:18.553 回答