AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 507599
Accepted
bux
bux
Asked: 2013-05-15 02:08:46 +0800 CST2013-05-15 02:08:46 +0800 CST 2013-05-15 02:08:46 +0800 CST

同一目录上的两个域(当 SSL 时)

  • 772

我的 apache2 配置有问题:我在服务器上有两个网站:

  • 域名1.tdl
  • 域2.tdl

其中之一 (domain2.tdl) 必须并且可以在端口 443 上访问(使用 SSL)。所有域都必须并且可以通过端口 80 访问。但是当我们尝试在端口 443 上访问 domain1.tdl 时,会显示 domain2.tdl 文件。因此,在端口 443 上,domain2.tdl 可由 domain1.tdl和domain2.tdl 访问。我不要!

我的配置:

域 1.tdl:

<VirtualHost *:80>
  DocumentRoot /home/sites/domain1.tdl/www
  ServerName domain1.tdl
  ServerAlias www.domain1.tdl
  ServerAdmin [email protected]
  RewriteEngine on
  <Directory "/home/sites/domain1.tdl/www">
    AllowOverride All
    allow from all
    Options -Indexes
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot /home/sites/domain1.tdl/www
  ServerName domain1.tdl
  ServerAlias www.domain1.tdl
  ServerAdmin [email protected]
  RewriteEngine on
  <Directory "/home/sites/domain1.tdl/www">
    AllowOverride All
    allow from all
    Options -Indexes
</Directory>

域 2.tdl:

<VirtualHost *:80>
  DocumentRoot "/home/sites/domain2.tdl/web"
  ServerName domain2.tdl
  ErrorLog /var/log/apache2/site/error_domain2.tdl.log              
  CustomLog /var/log/apache2/site/access_domain2.tdl.log combined
  <Directory "/home/sites/domain2.tdl/web">
    allow from all
    Options -Indexes
  </Directory>
  ServerAlias www.domain2.tdl
</VirtualHost>

<VirtualHost domain2.tdl:443>
  DocumentRoot "/home/sites/domain2.tdl/web"
  ServerName domain2.tdl
  ErrorLog /var/log/apache2/site/error_domain2.tdl.log
  CustomLog /var/log/apache2/site/access_domain2.tdl.log combined

  SSLEngine on
  SSLCertificateFile /etc/ssl/private/domain2.tdl/domain2.tdl.crt
  SSLCertificateKeyFile /etc/ssl/private/domain2.tdl/domain2.tdl.key
  SSLCACertificateFile /etc/ssl/private/domain2.tdl/GandiStandardSSLCA.pem
  SSLVerifyClient None

  <Directory "/home/sites/domain2.tdl/web">
    allow from all
    Options -Indexes
  </Directory>
  ServerAlias www.domain2.tdl
</VirtualHost>
apache-2.2
  • 1 1 个回答
  • 531 Views

1 个回答

  • Voted
  1. Best Answer
    Jenny D
    2013-05-15T02:51:22+08:002013-05-15T02:51:22+08:00

    解释

    当您使用 NameVirtualHosts 时,Apache 将使用 Host: 标头中给出的主机名来确定您应该访问的虚拟主机。这在历史上一直是 SSL 的问题——因为整个会话都是加密的,包括Host: 标头,Apache 需要解密会话才能确定要使用哪个虚拟主机。但是解密所需的信息在 VirtualHost 部分内,创建了一个陷阱 22 - apache 需要一个 VirtualHost 但它不知道是哪个,所以它会选择它找到的第一个。

    最近的 SSL 实现包括 SNI,这使得提供未加密的主机名成为可能。但是为了让它工作,服务器和客户端都需要运行相当新的 SSL 版本,虽然您可以控制服务器,但通常您无法控制客户端。

    解决方案

    首先,由于您不希望通过 SSL 访问 domain1.tdl,您可以简单地删除VirtualHost:443domain1 的部分。(这不会解决当前的问题,但是如果您不想使用它,您不应该保留配置;在某些时候它会给您带来问题!)

    其次,您需要创建一些方法来在 SSL 协商后检查主机名是否正确,并且只允许流量流向正确的主机名。最简单的方法是使用 mod_rewrite 并进行标头检查,并拒绝所有主机名不正确的流量。这是一个例子:

    RewriteEngine On # to turn rewriting on
    
    RewriteCond %{HTTP_HOST} ^(www.)?domain2.tdl   # If http_host doesn't match (www.)domain2.tdl
    RewriteRule (.*) http://%{HTTP_HOST}/$1    # then redirect to http for the hostname that was used, keeping the path intact
    

    如果您只想让他们知道不允许访问,您可以发出错误消息:

    RewriteEngine On # to turn rewriting on
    
    RewriteCond %{HTTP_HOST} ^(www.)?domain2.tdl   # If http_host doesn't match (www.)domain2.tdl
    RewriteRule (.*) - [F]                     # then issue a "403 Forbidden" error page
    

    这些命令应该在 domain2.tdl:443 的 VirtualHost 指令中。

    • 1

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve