是否可以对所有虚拟主机进行通配符 HTTP->HTTPS 重定向?

是否可以对所有虚拟主机进行通配符 HTTP->HTTPS 重定向?

在我们的开发服务器上,我们有多个站点供多个开发人员使用,这些站点通过 Apache 2.4.6 中的 vhost 运行。我们使用的是 CentOS 7。

我们希望将所有内容重定向http://www.site.ext.dev-username.commondomain.exthttps://www.site.ext.dev-username.commondomain.ext。这里,dev-usernamesite.ext可以根据开发站点和用户的不同而改变。

我们以前使用过类似的东西:

<VirtualHost *:80>
    ServerName www.site.ext.dev-username.commondomain.ext
    Redirect permanent / https://www.site.ext.dev-username.commondomain.ext/
</VirtualHost>

但有可能匹配任何(或者至少是通配符)ServerName并相应地重定向,即使用对正则表达式的反向引用?也许用DirectoryMatch或 之类的东西代替虚拟主机?

我在文档中注意到了这一点(用于目录和位置匹配),遗憾的是它与我的 Apache 版本不兼容:

从 2.4.8 开始,命名组和反向引用会被捕获并写入环境,其相应名称以“MATCH_”为前缀,且采用大写字母。这样就可以在表达式和模块(如 mod_rewrite)中引用 URL 元素。为了避免混淆,编号(未命名)的反向引用会被忽略。请改用命名组。

答案1

由于反向引用仅在 2.4.8 中启用(而我使用的是早期版本),我想到了一个替代解决方案,它不是纯 Apache 配置,但对我有用,并且可能对其他人有所帮助。

我添加了一个新的 vhost 配置,如下所示:

<VirtualHost *:80>
  ServerName 000_default_http.commondomain.ext
  ServerAdmin [email protected]

  DirectoryIndex index.html index.php
  DocumentRoot /var/www/html/000_default_http/
  <Directory /var/www/html/000_default_http/>
    AllowOverride All
    Require all granted
  </Directory>

  CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_web.log 86400" combined env=!image
  CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_image.log 86400" combined env=image
  ErrorLog "|/usr/sbin/rotatelogs -l /var/log/httpd/000_default_http%Y%m%d_error.log 86400"
</VirtualHost>

这里,ServerName 并不重要。因为我们给它一个文件名,000_default_http.conf它将被用作默认虚拟主机。我们需要做的是确保所有虚拟主机配置都指定:

<VirtualHost *:443>

然后,每当我们访问任何网站时,它都会使用上述配置。然后我在 中http://添加了以下内容:index.php/var/www/html/000_default_http/

<?php
if ($_SERVER['SERVER_PORT'] == '80') {
    header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit;
}

并通过添加文件确保所有目录都被捕获.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

所以现在,任何包含路径和查询字符串的 URL 都将从 http 重定向到 https。

请注意,如果你决定做过想要一个明确的 HTTP 站点(或多个)以及 HTTPS 站点,这没问题。只需确保您的站点000_default_http.conf按字母顺序出现在*:80虚拟主机配置中的第一个。如果 ApacheServerName在端口 80 上与这些配置匹配,它将使用它们,否则它将继续使用上述虚拟主机并重定向到 HTTPS 对应部分。

显然,你可以将 PHP 换成你选择的任何语言。但这种方法让我不必.htaccess在所有网站上使用单独的指令和/或混淆开发人员配置的每个 vhost 配置文件。

话虽如此,如果有人能想出一个更好的方法,可以仅在 apache 配置中完成,我会非常感兴趣听到它。

答案2

我正在使用以下虚拟主机:

<VirtualHost *:80>

    ServerName 'sub.domain.tld'

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

</VirtualHost>

这会将每个 HTTP 请求重定向到 HTTPS,并附带精确的路径

相关内容