下列的我刚刚解决的另一个问题我想知道:我们可以在 Apache 中做些什么来避免重复配置?那么 Apache 之外的呢?就我而言,它会是 AWS EC2 的 RHEL4,但我相信任何 **nix* 都会有类似的解决方案。也许像sed
,也许使用.htaccess
... 不知道。但这应该是预处理的,运行时什么都不做:就像 conf 文件一样,一旦 apache 加载就完成了。
这里我将复制我过去的解决方案只是为了说明:
UseCanonicalNames off
NameVirtualHost *:8888
<VirtualHost *:8888>
ServerName example1.com
ServerAlias *.example1.com
# below, stuff that will be repeated
# redirect to HTTPS
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^login\.(.*)$
RewriteRule ^(.*) https://%1/login$1 [L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>
<VirtualHost *:8888>
ServerAlias *
VirtualDocumentRoot /var/www/html/%-3
# below, stuff that need to be repeated
# redirect to HTTPS
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^login\.(.*)$
RewriteRule ^(.*) https://%1/login$1 [L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
RewriteRule ^/login(.*) https://%1/login$1 [L]
</VirtualHost>
我相信有很多类似的事情redirection_to_HTTPS
可能会成为函数 / 过程 / 宏 / 模板 / 包含/ ETC。
答案1
Apache 有一个include 指令。 就像是
UseCanonicalNames off
NameVirtualHost *:8888
<VirtualHost *:8888>
ServerName example1.com
ServerAlias *.example1.com
Include /etc/apache2/redirect_to_https.conf
</VirtualHost>
<VirtualHost *:8888>
ServerAlias *
VirtualDocumentRoot /var/www/html/%-3
Include /etc/apache2/redirect_to_https.conf
</VirtualHost>
/etc/apache2/redirect_to_https.conf 为
# below, stuff that will be repeated
# redirect to HTTPS
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^login\.(.*)$
RewriteRule ^(.*) https://%1/login$1 [L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.com)$
RewriteRule ^/login(.*) https://%1/login$1 [L]
不过,其他答案对于将代码转换为配置文件的更普遍问题很有用。
答案2
答案3
我可能因为发布这篇文章而被人称为“老派”,但我认为解决这个问题的经典方法是使用宏处理器,如 M4,它是 POSIX 标准。有一个 GNU 实现:
http://www.gnu.org/software/m4/
该页面提到 autoconf 是其最著名的用户,但我认为大多数系统管理员都是通过同样经典的 sendmail 第一次接触 M4。
例如,您可以维护配置文件和一些 Makefile 的 M4 版本,然后通过简单的 将它们“编译”为实际运行的配置make
。
答案4
类似的事情可以通过 Puppet 或 Capistrano 等管理框架来完成。在这些脚本中,创建了基于定义条件生成 httpd.conf 文件(以及相关包含文件)的脚本。这些常规的“在 X 处做这件事”操作可以功能化。我不知道相信有一些现成的方法可以完成这种事情,但是这些框架旨在允许您自己制作。