如何在Apache中实现适用于所有虚拟主机的全局RewriteCond/RewriteRule?

如何在Apache中实现适用于所有虚拟主机的全局RewriteCond/RewriteRule?,apache,mod-rewrite,virtualhost,Apache,Mod Rewrite,Virtualhost,标题几乎说明了一切。:-)我有很多虚拟主机,我想在httpd.conf文件的顶部放一个重写块,不管请求可能指向哪个虚拟主机,它都会重写URL。我该怎么做 我发现了,但我的问题是一样的:我如何做到这一点而不诉诸.htaccess文件并对每个虚拟主机执行其他操作 天哪 我从未测试过它,因此它可能不起作用,但我会尝试在所有虚拟主机块中向单个文件添加include指令。您必须更改每个虚拟主机配置块一次,但在此之后,您应该有一个中心位置来进行更改。YMMV.看起来最简单的解决方案是添加 RewriteOp

标题几乎说明了一切。:-)我有很多虚拟主机,我想在httpd.conf文件的顶部放一个重写块,不管请求可能指向哪个虚拟主机,它都会重写URL。我该怎么做

我发现了,但我的问题是一样的:我如何做到这一点而不诉诸.htaccess文件并对每个虚拟主机执行其他操作


天哪

我从未测试过它,因此它可能不起作用,但我会尝试在所有虚拟主机块中向单个文件添加
include
指令。您必须更改每个虚拟主机配置块一次,但在此之后,您应该有一个中心位置来进行更改。YMMV.

看起来最简单的解决方案是添加

RewriteOptions inherit
到每个VirtualHost指令。这至少比处理.htaccess文件简单得多。Apache非常清楚的一个事实是

默认情况下,重写配置为 不是继承的。这意味着你 需要打开引擎吗 中每个虚拟主机的指令 你想用它。 ()


显然,更改默认值的方法是通过重写子项(vhost或director)中的选项,因此您必须在每个子项中执行某些操作。

如果您只是试图重写名称的域部分中的某些内容,例如,为了修复常见的拼写错误,您甚至不需要“继承”选项。我设置了一个无名虚拟主机来捕获所有无效的主机名,并在重定向它们之前正确地重新调用它们

由于这使用重定向,因此在应用重写后将找到相应的虚拟主机

Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]

# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
    RewriteEngine on
    RewriteOptions inherit
</VirtualHost>
Options+索引+FollowSymLinks
重新启动发动机
#如果它仅以domain.com开头,请在www前面加上前缀并发送到www.domain.com
重写cond%{HTTP_HOST}^域[NC]
重写规则^(.*)http://www.domain.com$1[L,R=301]
#更正域名中的拼写错误,适用于域中的任何虚拟主机
#需要子域,即(serviceXXX.)domain.com,或前面的www.from
重写cond%{HTTP\u HOST}^([^.]+\.)dommmmain\.com\.?(:[0-9]*)?$[NC]
重写规则^(.*)%{HTTP_HOST}$1[C]
重写规则^([^.]+\)?domain.com(.*)http://$1domain.com$2[L,R=301]
#无名称虚拟主机,用于捕获所有无效主机名并修改和重定向它们
重新启动发动机
重写选项继承
对于我想要的所有指令,我总是使用“全面”VHost,比如

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>

<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............ 
听80
名称虚拟主机*:80
ErrorLog“/var/log/apache2/error\u log”
服务器名AllowTherestofthevhosts.com
DocumentRoot“/ServiceData/。。。。。。。。。
............ 
它似乎一直在工作……错误日志被正确地组合在一起,等等……但这可能是一个早期的/冲突的/志同道合的指令的结果


个人说明..谁发明了Apache配置模式和语法,谁就是一只丁巴狗,或者一群丁巴狗,他们在洞穴里花了太多时间…整个事情应该被驱魔化和XML化,或者什么的!尽管他们两个都有很大的不同…Hello Kitty的设置过程..与极其简洁的配置..are这两种设置都更具逻辑性。

默认情况下,虚拟主机不会继承主服务器上下文中的mod_rewrite配置设置。要使主服务器设置应用于虚拟主机,必须在每个
部分中放置以下指令:

RewriteEngine On
RewriteOptions Inherit 

单击以查找更多信息

在父作用域(如httpd.conf)中指定
重写选项
,以便在子虚拟主机中应用规则,而无需修改它们

这仅适用于
RewriteEngine
指令设置为
on
的虚拟主机:


请注意,重写配置不是由虚拟主机继承的。这意味着您需要为要使用重写规则的每个虚拟主机都有一个rewrite ENGINE on指令

()

Apache从2.4.8开始就支持这一点(在提出原始问题时不可用)

重写选项的文档中:

向下继承

如果启用此选项,则所有子配置将继承当前配置的配置。这相当于在所有子配置中指定“重写选项继承”。有关如何处理父子关系的详细信息,请参阅“继承”选项。 在Apache HTTP服务器2.4.8及更高版本中提供

与上面的InheritDown类似,但是当前范围中的规则在任何子范围中指定的规则之前应用。 在Apache HTTP服务器2.4.8及更高版本中提供

忽略继承

此选项强制当前配置和子配置忽略将从指定InheritDown或InheritDownBefore的父配置继承的所有规则。 在Apache HTTP服务器2.4.8及更高版本中提供

()


您可能希望使用InheritDownBefore,以避免向vHost添加更多垃圾

全局letsencrypt别名示例:

# letsencrypt
<IfModule alias_module>
    Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
    # prevent vhost rewrites from killing the alias
    RewriteEngine On
    RewriteOptions InheritDownBefore
    RewriteCond %{REQUEST_URI} ^/\.well\-known
    RewriteRule . - [L,PT]
</IfModule>
#letsencrypt
别名/.well-known//var/www/html/.well-known/
#防止vhost重写终止别名
重新启动发动机
重写之前的选项
RewriteCond%{REQUEST\u URI}^/\.众所周知
重写规则。-[L,PT]
然后,您可以在每个vhost中执行此操作,而无需其他指令:

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>

....
重新启动发动机
重写规则^/*/index.php[L,PT]

感谢所有人的回答。它帮助我找到了答案

问题已经回答了,我只是想添加一个例子,以防您使用谷歌计算引擎。它说它需要
apachehttp服务器
RewriteOptions InheritDown
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTP_HOST} !\.co$ [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)\.[^.]+$ [NC]
RewriteRule ^ https://%1.co%{REQUEST_URI} [L,NE,R=301]
<VirtualHost *:80>
 RewriteEngine On
 ServerAlias *.*
</VirtualHost>