Apache 如果规则在全局配置中匹配,则停止执行virtualhost重写规则

Apache 如果规则在全局配置中匹配,则停止执行virtualhost重写规则,apache,redirect,mod-rewrite,url-rewriting,virtualhost,Apache,Redirect,Mod Rewrite,Url Rewriting,Virtualhost,我有以下设置。 Apache为每个站点运行一个单独的VirtualHost文件。 其中每一个都有自己的重写规则集,例如http到https,这些规则都运行良好 我们希望发生的是,从全局配置中,我们需要能够检查请求是否针对特定的子目录。如果是这样的话,我们应该允许这个请求按它应该的方式处理,但在这一点上,我们不希望单独的虚拟主机文件重写规则生效。因此,允许在非https连接上提供此目录,而不将其重定向到https 我已经设置了重写规则,可以在目录上进行匹配,如果它与全局url匹配,则可以重定向到外

我有以下设置。 Apache为每个站点运行一个单独的VirtualHost文件。 其中每一个都有自己的重写规则集,例如http到https,这些规则都运行良好

我们希望发生的是,从全局配置中,我们需要能够检查请求是否针对特定的子目录。如果是这样的话,我们应该允许这个请求按它应该的方式处理,但在这一点上,我们不希望单独的虚拟主机文件重写规则生效。因此,允许在非https连接上提供此目录,而不将其重定向到https

我已经设置了重写规则,可以在目录上进行匹配,如果它与全局url匹配,则可以重定向到外部url,这表明它继承了全局url,但如果我尝试只允许它通过虚拟主机进行重写,则会启动并重定向

我尝试过使用L和END,但这也不起作用。 有没有办法在不编辑已配置的虚拟主机文件的情况下实现这一点

主httpd配置条目

<Directory "/www">
Options Indexes Includes FollowSymLinks MultiViews
        AllowOverride All
        allow from all
        Order allow,deny
        Require all granted

RewriteEngine On
RewriteOptions InheritDownBefore

RewriteCond %{REQUEST_URI} ^/sub_directory/$ [NC]
RewriteRule ^(.*) $1  [L,END]
#RewriteRule ^(.*) -  [L,END]
#RewriteRule ^(.*) http://www.google.com  [L,END]  # This does get triggered

</Directory>

选项索引包括以下符号链接多视图
允许超越所有
通融
命令允许,拒绝
要求所有授权
重新启动发动机
重写之前的选项
RewriteCond%{REQUEST_URI}^/sub_directory/$[NC]
重写规则^(.*)$1[L,结束]
#重写规则^(.*)-[L,结束]
#重写规则^(.*)http://www.google.com  [L,END]#这会被触发
示例虚拟主机文件

<VirtualHost *:80>
ServerName urlone.com
ServerAlias urltwo.com

DocumentRoot /www/

RewriteEngine On

# redirect to https
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://urlone.com$1 [R=301,L]

</VirtualHost>

ServerName urlone.com
服务器别名URLTOW.com
DocumentRoot/www/
重新启动发动机
#重定向到https
重写cond%{HTTPS}=在…上
重写规则^(.*)https://urlone.com$1[R=301,L]
因此,如果我访问urlone.com,它应该重定向到,但如果我访问urlone.com/sub_目录,它需要不允许重定向到https

我希望这对某人有意义,并提前感谢您的帮助。

在global httpd.conf中:

RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} ^/sub_directory$ [NC]
RewriteRule ^ - [E=PATH_MATCHED:true]
(如果需要,可以向上述规则添加其他规则或其他标志)

在virtual_host.conf中

RewriteCond %{ENV:PATH_MATCHED} !=true
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://urlone.com%{REQUEST_URI} [R=301,L]
在global httpd.conf中:

RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} ^/sub_directory$ [NC]
RewriteRule ^ - [E=PATH_MATCHED:true]
(如果需要,可以向上述规则添加其他规则或其他标志)

在virtual_host.conf中

RewriteCond %{ENV:PATH_MATCHED} !=true
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://urlone.com%{REQUEST_URI} [R=301,L]

感谢您的建议,问题是我们正试图避免独立更新虚拟主机文件,因为虚拟主机文件很多。如果我们无法找到其他不进行编辑的方法,那么这可能就是我的方法。如果在您的http.conf中,您只是将
RewriteRule^(.*)$1[L,END]
更改为
RewriteRule^-[L,END]
恐怕没有运气,使用RewriteRule^-[L,END]取而代之的是,它仍在继续处理重定向到https的虚拟主机。感谢您的建议,问题在于我们正试图避免独立更新虚拟主机文件,因为虚拟主机文件很多。如果我们无法找到其他不进行编辑的方法,那么这可能就是我的方法。如果在您的http.conf中,您只是将
RewriteRule^(.*)$1[L,END]
更改为
RewriteRule^-[L,END]
恐怕没有运气,使用RewriteRule^-[L,END]取而代之的是,它仍然继续处理重定向到https的虚拟主机。