宏、模板、函数或者类似于 apache conf 文件的东西

宏、模板、函数或者类似于 apache conf 文件的东西

下列的我刚刚解决的另一个问题我想知道:我们可以在 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

好吧,感谢大家如此精彩的回答,但是......可能mod_macro是最好的办法。

并且它的理想好处我在寻找:

  • 需要维护的配置文件更小。
  • 由于复制粘贴而导致的错误较少,仅部分更新。
  • 更好的可读性。例如:使用AllowLocalAccess可能被认为比 allow from 192.54.172.0/24 192.54.148.0/24 10.0.0.0/8
  • 这一切的代价并不是perl或者米4编程。

下次有机会,我会尝试所有解决方案,从这个开始,然后添加一个模板我所用过的东西...除非有人好心先把所有事情都做完!:)

答案3

我可能因为发布这篇文章而被人称为“老派”,但我认为解决这个问题的经典方法是使用宏处理器,如 M4,它是 POSIX 标准。有一个 GNU 实现:

http://www.gnu.org/software/m4/

该页面提到 autoconf 是其最著名的用户,但我认为大多数系统管理员都是通过同样经典的 sendmail 第一次接触 M4。

例如,您可以维护配置文件和一些 Makefile 的 M4 版本,然后通过简单的 将它们“编译”为实际运行的配置make

答案4

类似的事情可以通过 Puppet 或 Capistrano 等管理框架来完成。在这些脚本中,创建了基于定义条件生成 httpd.conf 文件(以及相关包含文件)的脚本。这些常规的“在 X 处做这件事”操作可以功能化。我不知道相信有一些现成的方法可以完成这种事情,但是这些框架旨在允许您自己制作。

相关内容