子域的SSL允许父域重定向到子域

时间:2017-04-01 13:44:55

标签: apache ssl subdomain virtualhost

我为子域启用了SSL,一切都运行良好。我遇到的问题是,当您为父域(不应允许SSL连接)包含https时,它会重定向到子域作为父域。

我假设我的虚拟主机条目中有些内容不正确。

有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

你没有提供很多细节,但现在就开始了。

指定HTTPS://<hostname>时,TCP消息将发送到<ip address>:443。不是<hostname>:443。您的浏览器在发送任何内容之前会执行主机名 - > IP地址转换。您的浏览器还会在标题Host: <hostname>中添加(加密)消息。

只有在解压缩加密消息时,网络服务器才会获得主机标头,然后(可能)将其路由到其他虚拟主机。

但在解密时,它“已经”与SSL虚拟主机通话(否则,apache无法解密该消息)。因此,此时,它会尝试找出“所需”主机名是什么(通过Hosts标头),然后查看您是否拥有具有该名称的443虚拟主机。如果没有,则将其交给默认设置:443虚拟主机。

答案 1 :(得分:1)

<强>假设

  • 您在同一个httpd实例上托管这两个域
  • 您只有一个端口443的虚拟主机定义

我还假设当你说“重定向到子域作为父”时,你的意思是应该只出现在HTTPS子域(即https://sub.example.com)的内容出现在HTTPS父域(即https://example.com看起来与https://sub.example.com完全相同)并且没有发生真正的HTTP重定向

,然后

如果你有两个虚拟主机条目:

<VirtualHost *:80>
  # using parent content
  DocumentRoot "/web/parent"
</VirtualHost>

<VirtualHost *:443>
  #using subdomain content
  DocumentRoot "/web/subdomain"

  # All sorts of SSL config
  ....
</VirtualHost>

无论您使用什么主机名,都会产生这样的结果:

  • 对端口80的任何请求将始终生成父内容
  • 对端口443的任何请求将始终生成子域内容

<强>所以:

尝试添加“NameVirtualHost *:443”(如果您还没有)和至少第三个VirtualHost:

NameVirtualHost *:443

<VirtualHost *:80>
  # the default virtualhost for port 80
  # using parent content
  DocumentRoot "/web/parent"
</VirtualHost>

<VirtualHost *:443>
  # the default virtualhost for port 443
  # using subdomain content
  ServerName sub.example.com
  DocumentRoot "/web/subdomain"

  # All sorts of SSL config
  ....
</VirtualHost>

<VirtualHost *:443>
  # another virtualhost for port 443 
  # only activated for example.com like https://example.com/something
  # using parent content
  ServerName example.com
  DocumentRoot "/web/parent"

  # All sorts of SSL config
  ....
</VirtualHost>

评估顺序很重要,因此第一个虚拟主机成为任何与任何其他虚拟主机不匹配的请求的默认值。

当有人在父域上请求HTTPS时,需要为您希望发生的任何事情配置第三个虚拟主机:即,您是要重定向回HTTP版本,还是仅提供不同的内容?

httpd command有一个-S标志,它将输出当前排序的虚拟主机配置,然后退出,这对于诊断在哪些端口和相关名称上定义的虚拟主机非常有用

-S
  Show the settings as parsed from the config file (currently only shows the virtualhost settings).

有些配置,版本和平台会对此问题有所帮助。

答案 2 :(得分:0)

    ServerAdmin webmaster @ localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

#   A self-signed (snakeoil) certificate can be created by installing
#   the ssl-cert package. See
#   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
#   If both key and certificate are stored in the same file, only the
#   SSLCertificateFile directive is needed.
SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key