RewriteCond里的%N反向引用

我正在开发一个虚拟域系统。 我有一个通配符DNS设置为*.loc ,我试图在我的.htaccess文件。 以下代码工作:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC] RewriteCond %{REQUEST_URI} !^/example/ RewriteRule (.*) /example/$1 [L,QSA] 

但是,我希望这可以与我放入的任何东西一起工作。但是,我需要根据find的文本检查%{REQUEST_URI} 。 我试着用这个代码:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC] RewriteCond %{REQUEST_URI} !^/%3/ RewriteRule (.*) /%3/$1 [L,QSA] 

但行RewriteCond %{REQUEST_URI} !^/%3/导致我的代码通过内部服务器错误。 我知道这是因为我的代码中有%N,但有没有办法使用它? 我需要这一行,否则我的代码从内部redirect失败。

我希望这对某人有意义。 我所需要的是能够在以下RewriteCond中反向引用RewriteCond。

有两件事你在这里做错了。

首先,你的%{HTTP_HOST}正则表达式不好。 你需要逃避. 否则将被视为“不是换行符的任何字符”。 这基本上使得%3反向引用是TLD之前主机名的最后一个字符(例如http://blah.bar.loc = r )。

其次,你不能在RewriteCond的正则表达式中使用反向引用,只能使用左侧的字符串,这是一个奇怪的限制。 但是,您可以在正则表达式中使用\1引用,这样就可以构造一个聪明的左侧字符串来匹配。 就像%3::%{REQUEST_URI}然后你可以像这样匹配: !^(.*?)::/\1/? 。 这个正则表达式实质上是这样说的:“在:: 之前匹配并分组第一个文本块,然后确保::之后的文本块以/(first block)开头”。

所以你的规则应该是这样的:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC] RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/? RewriteRule (.*) /%3/$1 [L,QSA]