Apache重定向到错误的虚拟主机

时间:2020-06-04 19:53:04

标签: apache

我正在尝试设置两个虚拟主机,一个用于我的网站,另一个用于我的nextcloud实例。这是我的配置文件:

/etc/apache2/site-available/000-default.conf

<IfModule mod_ssl.c>
  <VirtualHost _default_:80>
    ServerName domain.com
    ServerAlias www.domain.com
    DocumentRoot "/var/www/html"
    CustomLog /var/log/apache2/nc-access.log combined
    ErrorLog  /var/log/apache2/nc-error.log
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
  </VirtualHost>
  <Directory /var/www/html/>
    Options +FollowSymlinks
    AllowOverride All
    <IfModule mod_dav.c>
      Dav off
    </IfModule>
    LimitRequestBody 0
    SSLRenegBufferSize 10486000
  </Directory>
</IfModule>

/etc/apache2/site-available/nextcloud.conf

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerName nextcloud.domain.com
    DocumentRoot "/var/www/nextcloud"
    CustomLog /var/log/apache2/nc-access.log combined
    ErrorLog  /var/log/apache2/nc-error.log
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
  </VirtualHost>
  <Directory /var/www/nextcloud/>
    Options +FollowSymlinks
    AllowOverride All
    <IfModule mod_dav.c>
      Dav off
    </IfModule>
    LimitRequestBody 0
    SSLRenegBufferSize 10486000
  </Directory>
</IfModule>

apache2ctl -S的输出,显示已激活的主机:

VirtualHost configuration:
*:80                   domain.com (/etc/apache2/sites-enabled/000-default.conf:2)
*:443                  nextcloud.domain.com (/etc/apache2/sites-enabled/nextcloud.conf:2)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default 
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

当我在浏览器中输入domain.com时,希望它加载我的网站/var/www/html。但是,它将加载我的nextcloud(/var/www/nextcloud)实例。如何使domain.com重定向到我的网站而不是我的nextcloud实例?

1 个答案:

答案 0 :(得分:0)

您应该像这样修改您的配置(以下说明):

/etc/apache2/site-available/000-default.conf

<VirtualHost _default_:80>
    ServerName domain.com
    ServerAlias www.domain.com

    DocumentRoot "/var/www/html"

    CustomLog /var/log/apache2/80_nc-access.log combined
    ErrorLog  /var/log/apache2/80_nc-error.log

    <Directory /var/www/html/>
        Options +FollowSymlinks
        AllowOverride All
        <IfModule mod_dav.c>
            Dav off
        </IfModule>
        LimitRequestBody 0
    </Directory>
</VirtualHost>

/etc/apache2/site-available/nextcloud.conf

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName nextcloud.domain.com

        DocumentRoot "/var/www/nextcloud"

        CustomLog /var/log/apache2/443_nc-access.log combined   
        ErrorLog  /var/log/apache2/443_nc-error.log

        SSLEngine on
        SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

        <Directory /var/www/nextcloud/>
            Options +FollowSymlinks
            AllowOverride All
            <IfModule mod_dav.c>
                Dav off
            </IfModule>
            LimitRequestBody 0
            SSLRenegBufferSize 10486000
        </Directory>

    </VirtualHost>
</IfModule>

更改

  • 在您的:80 VirtualHost中,您不应具有任何SSL指令。端口80用于http://连接。因此,我删除了与SSL相关的所有内容。
  • 在您的:443 VirtualHost中,您想要使用SSL指令。所以保留这些。
  • <Directory>伪指令应包含在<VirtualHost>部分中。无论如何,这些仅在您的<VirtualHost>上下文中才有意义。 httpd.conf中应该有一个通用的<Directory>,它会阻止直接访问所有目录。
  • 我建议您为每个<VirtualHost>使用单独的日志文件。这是一个好习惯,相信我,我有20台主机的Apache服务器,不可能弄清楚哪个日志条目是针对哪个的。另外,您可能想将SSL放入“调试”日志中以进行故障排除...
  • 要到达第一个<VirtualHost>,请输入http://example.com
  • 要到达第二个<VirtualHost>,请输入https://example.com

这里没有重定向。仅<Virtualhost>名称和端口分配。 Apache查看您要查询的内容(浏览器地址栏中的网站),并使用最符合您要求的<VirtualHost>。如果找不到特定的,则默认使用第一个。

这说明了为什么如果尝试使用https://example.com,Apache将基于端口选择<VirtualHost>。这是端口443(https://)。因此,Apache将以您的云<VirtualHost>进行响应。端口是此处的决定因素,不是域名。