如何在 Apache 和 dynu/No-ip 服务中使用一个或多个文件配置多个虚拟主机?

如何在 Apache 和 dynu/No-ip 服务中使用一个或多个文件配置多个虚拟主机?

你好,我的服务器上有 3 个域名,安装了 ububtu 22.04 和 apache,但遇到了这个问题

我在共享主机中有 3 个域名,每个域名都有自己的网页 domain-a.com

域名-b.com

域名-c.com

我也有 3 个 no-ip 域名,我已将它们重定向到我家里具有动态 ip 的服务器(出于这个原因,使用 no-ip)

在我家我已经配置了

domain-a.no-ip.com

domain-b.no-ip.com

domain-c.no-ip.com

在每个网站中,我都在 apache 中创建了自己的网站

/var/www/domain-a(该网站使用端口 8180)

/var/www/domain-b(该网站使用端口 8185)

/var/www/domain-c(该网站使用端口 8190)

我还在 /etc/apache2/sites-available 上创建了 3 个配置文件,每个域一个

我还启用了 3 个 conf 文件

sudo a2dissite 000-默认

sudo a2ensite 域-a.conf

sudo a2ensite 域-b.conf

sudo a2ensite 域-c.conf

sudo 服务 apache2 重启

<VirtualHost *:80>
   ServerName domain-a.no-ip.com
   Redirect / https://domain-a.no-ip.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain-a.no-ip.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
         <VirtualHost _default_:443>

                 ServerName domain-a.no-ip.com
                 ServerAdmin [email protected]

                 DocumentRoot /var/www/domain-a/

                 ProxyPass / http://localhost:8180/
                 ProxyPassReverse / http://localhost:8180/

                 SSLEngine on

                 SSLCertificateFile /etc/letsencrypt/live/domain-a.no-ip.com/fullchain.pem
                 SSLCertificateKeyFile /etc/letsencrypt/live/domain-a.no-ip.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
         </VirtualHost>
</IfModule>


<VirtualHost *:80>
   ServerName domain-b.no-ip.com
   Redirect / https://domain-b.no-ip.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain-b.no-ip.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
         <VirtualHost _default_:443>

                 ServerName domain-b.no-ip.com
                 ServerAdmin [email protected]

                 DocumentRoot /var/www/domain-b/

                 ProxyPass / http://localhost:8185/
                 ProxyPassReverse / http://localhost:8185/

                 SSLEngine on

                 Include /etc/letsencrypt/options-ssl-apache.conf
                 SSLCertificateFile /etc/letsencrypt/live/domain-b.no-ip.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain-b.no-ip.com/privkey.pem
         </VirtualHost>
</IfModule>


<VirtualHost *:80>
   ServerName domain-c.no-ip.com
   Redirect / https://domain-c.no-ip.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain-c.no-ip.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
         <VirtualHost _default_:443>

                 ServerName domain-c.no-ip.com
                 ServerAdmin [email protected]

                 DocumentRoot /var/www/domain-c

                 ProxyPass / http://localhost:8190/
                 ProxyPassReverse / http://localhost:8190/

                 SSLEngine on

                 SSLCertificateFile /etc/letsencrypt/live/domain-c.no-ip.com/fullchain.pem
                 SSLCertificateKeyFile /etc/letsencrypt/live/domain-c.no-ip.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
         </VirtualHost>
</IfModule>

然后在域 a 的 cloudflare 中我创建了一个 CNAME www2 和目标域 a.no-ip.com

然后在 domain-b 的 cloudflare 中我创建了一个 CNAME www2 和目标 domain-b.no-ip.com

然后在 domain-c 的 cloudflare 中我创建了一个 CNAME www2 和目标 domain-c.no-ip.com

现在,如果我在任何 Web 浏览器中输入 www2.domain-a.com 或 www2.domain-b.com 或 www2.domain-c.com,系统始终会将我重定向到我家乡服务器上的 domain-b

但如果我通过直接地址 domain-a.no-ip.com 或 domain-b.no-ip.com 或 domain-c.no-ip.com 输入,它会将我发送到我家服务器的每个网页

令我惊讶的是,如果我通过 no-ip 地址输入,它会将我重定向到我服务器上的 3 个页面中的每一个,但如果我通过 3 个 cname 输入,它总是将我重定向到域 b

谢谢

答案1

解决此问题的简单方法是使用ServerAliasApache 配置。请尝试以下操作:

<VirtualHost *:80>
    ServerName domain-c.no-ip.com
    ServerAlias domain-c.com
    Redirect / https://domain-c.no-ip.com/
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =domain-c.no-ip.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName domain-c.no-ip.com
        ServerAlias domain-c.com
        ServerAdmin [email protected]

        DocumentRoot /var/www/domain-c

        ProxyPass / http://localhost:8190/
        ProxyPassReverse / http://localhost:8190/

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/domain-c.no-ip.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain-c.no-ip.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

使用ServerAlias,您还可以配置多个域以指向同一个源目录。例如:

ServerAlias domain-c.com *.domain-c.com domain-c.net domain-c.org

笔记:值中支持通配符ServerAlias

需要注意的一点是,Let's Encrypt SSL 证书可能不适用于您的 CloudFlare 域,除非该证书对多个域有效,或者您在外部使用 CloudFlare 的 SSL 并通过 HTTP 将流量转发到您的主服务器。

相关内容