我保证我一直在寻找答案的答案,但它仍然没有用。这就是我所拥有的:
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”。
此处的计划是能够在服务器上创建开发和测试环境,而无需在我的主服务器上重新创建环境,确保所有服务器设置完全相同。此外,它可以做任何我希望它做的事情我想,但这是迫切的需要。
答案 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”并且!
使得不会应用规则。