我正在使用虚拟域系统。我将通配符DNS设置为*.loc
,并且正在尝试处理.htaccess
文件。以下代码有效:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/example/
RewriteRule (.*) /example/$1 [L,QSA]
但是,我希望它可以与我输入的任何内容一起使用。但是,我需要根据作为域发现的文本对
%{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,但是我可以使用它吗?我需要这一行,否则,我的代码将因内部重定向而失败。我希望这对某人有意义。我需要做的就是能够在以下RewriteCond中反向引用RewriteCond。
最佳答案
您在这里做错了两件事。
首先,您的%{HTTP_HOST}
正则表达式不好。您需要转义.
点,否则它们将被视为“不是换行符的任何字符”。这实际上使%3
反向引用成为TLD之前主机名的最后一个字符(例如http://blah.bar.loc
,%3 = 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]
关于apache - RewriteCond内部的%N个反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970170/