apache - RewriteCond内部的%N个反向引用

标签 apache .htaccess mod-rewrite wildcard-subdomain backreference

我正在使用虚拟域系统。我将通配符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/

相关文章:

macos - 如何在 Mac Mavericks 上永久停止 apache?

Apache2 和 SSH。都在端​​口相同的IP和端口上

javascript - 从 Internet 加载特定网页时可以加载本地 CSS 文件吗?

php - Ubuntu 14.04 apache2 配置问题

php - .htaccess 并使 url 友好

apache - 窗口中的多个tomcat实例

linux - apache日志中没有IP地址

php - 将任何 GET 请求重定向到单个 php 脚本

php - 特定页面的 apache 重写规则问题

.htaccess - 交响乐2 : How to remove the "/web/" folder from the url in a shared hosting?