Puppetlabs-Apache:为虚拟主机同时启用 80 和 443

Puppetlabs-Apache: enable both 80 and 443 for virtualhost

我对 Puppet 比较陌生,目前正在研究 'puppetlabs-apache' 模块。在虚拟主机上同时设置 ssl 和非 ssl 时我遗漏了一些东西。

已应用清单:

include apache
include apache::mod::rewrite

#apache::vhost { 'site.mydomain.com':
# port         => '80',
# docroot      => '/var/www/site',
# rewrite_rule => '(.*) https://site.mydomain.com [R,L]',
#}

apache::vhost { 'site.mydomain.com':
  port          => '443',
  ssl           => true,
  docroot       => '/var/www/site',
  docroot_owner => 'www-data',
  docroot_group => 'www-data',
#  rewrite_rule  => '(.*) https://site.mydomain.com [R,L]',
}

问题是我不需要非 ssl(80 端口),但所有请求都应重定向到 443。

如果我注释掉端口 80 的 site.mydomain.com 的第一个 vhost 定义,它会抛出一个错误:

Error 400 on SERVER: Duplicate declaration: Apache::Vhost[site2.mydomain.com] is already declared in file..

不确定我在这里遗漏了什么。我应该怎么做才能使这种永久重定向发生?

http://site2.mydomain.com/ => https://site2.mydomain.com/

要配置虚拟主机以将未加密的连接重定向到 SSL,请使用单独的 apache::vhost 定义类型声明它们,并将未加密的请求重定向到启用 SSL 的虚拟主机:

apache::vhost { 'site.mydomain.com:80':
  servername      => 'site.mydomain.com',
  port            => '80',
  docroot         => '/var/www/site',
  rewrite_rule    => '(.*) https://site.mydomain.com [R,L]',
  redirect_status => 'permanent',
  redirect_dest   => 'https://site.mydomain.com'
}

apache::vhost { 'site.mydomain.com:443':
  servername    => 'site.mydomain.com',
  port          => '443',
  ssl           => true,
  docroot       => '/var/www/site',
  docroot_owner => 'www-data',
  docroot_group => 'www-data',
  rewrite_rule  => '(.*) https://site.mydomain.com [R,L]',
}

您还需要 non-ssl 虚拟主机资源的那些额外 redirect 属性。由于 apache::vhost 是没有 namevar 的已定义资源类型,您可以通过使用两个唯一且纯装饰性的资源标题来规避多重资源声明问题。

计算出 Matt 的答案和错误 运行 这让我得出了以下答案。

apache::vhost { 'site.mydomain.com:80' ... } 

apache::vhost { 'site.mydomain.com:443' : ...}

谢谢,