使用VirtualDocumentRoot

时间:2018-01-10 11:57:23

标签: apache ubuntu ssl virtualhost

我在ubuntu 16.04 VM上进行开发工作

当我在许多项目上工作时,为了让我的生活更轻松,我使用* .dev域名将VirtualDocumentRoot和hosts文件从我的主文件夹用于服务器站点:

在000-default.conf中我有:

<VirtualHost *:80>
  VirtualDocumentRoot  /home/steve/websites/%-2/%-2/public_html
  ServerAlias *.dev
</VirtualHost>

然后在主持人中我有我正在处理的各种网站:

127.0.0.1   somesite.dev
127.0.0.1   another.dev
127.0.0.1   athirdone.dev
127.0.0.1   blog.athirdone.dev

这样,当我添加一个新项目时,我只需要在网站目录中创建正确的文件夹结构并向主机添加一行,例如,如果我想处理一个新项目somecoolproject.dev,我只需添加一个文件夹:

/home/steve/websites/somecoolproject/somecoolproject/public_html

和主机中的一行:

127.0.0.1    somecoolproject.dev

我很高兴。

无论如何,我现在所做的几乎所有事情都运行在https上,并且许多项目都有代码来强制执行此操作,无论是在源代码还是htaccess等,这使得使用dev副本变得很痛苦。

我想在我的开发机器上创建一个自签名证书,理想情况是我不需要为每个项目生成一个新的证书,所以某种通配符* .dev会很棒。

但即使我确实需要为每个项目创建一个新项目,我仍然无法解决如何使用我的设置安装它 - 我找到的所有内容都假设一个固定的文档和硬编码的服务器名称。

2 个答案:

答案 0 :(得分:1)

我们喜欢赏金,因为为您编写解决方案需要一段时间:)您的问题的真正答案是如何使其工作,而VirtualDocumentRoot不适用于SSL。我建议将来自默认SSL虚拟主机的请求代理到动态非ssl虚拟主机。这可以通过保留所请求的主机名来实现。

首先,完成所有的初步工作:1 /生成您的私钥和证书(如果您愿意,可以使用通配符),有很多教程,2 /在您的主httpd.conf中激活Include for the extra /httpd-ssl.conf

在httpd-ssl.conf中,你需要这个conf(我测试成功):

UseCanonicalName Off
ProxyPreserveHost  On

SetEnvIf  Server_Addr "(.*)"  sname=$1

RewriteEngine   On
RewriteCond     "%{HTTPS}" =on
RewriteRule     ^/(.*)$ "http://%{ENV:sname}:80/$1" [P]

我还建议自定义日志格式,然后你会看到更好的请求。这将有助于以后的调试,这里有一些指令用于记录请求的主机名,您可以通过日志行的长度识别SSL或非SSL流量。 在httpd.conf中,查找定义LogFormat的位置并添加:

LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" enhanced
LogFormat "%V %h %l %u %t \"%r\" %>s %b" enhancedSSL
CustomLog "logs/access_log" enhanced

在httpd-ssl.conf中,你只需要这个:

CustomLog "logs/access_log" enhancedSSL

告诉我们它是否按预期工作。 一旦工作,下一步可能是至少从远程禁用非SSL流量。要实现此目的,请将本地防火墙配置为阻止端口80上的请求,或者(更好)将VirtualHost配置为仅在本地侦听(VirtualHost 127.0.0.1:80而不是*:80)。

答案 1 :(得分:1)

如果我理解正确的要求,您想知道:

  • 如何为* .dev
  • 生成通配符SSL证书
  • 如何在本地配置apache,其配置允许服务器在SSL / TLS上使用任何* .dev域,而无需在创建新* .dev域时更改配置。

如果我理解正确,这肯定是可行的。

如何工作:SNI - 服务器名称指示,TLS协议扩展,其中,在建立TLS连接时传递主机名,BEFORE HTTP数据(如主机头)可用。所有流行的网络浏览器,curl,所有流行的网络服务器都支持它。

步骤:

首先。生成证书:

mindaugas@mindaugas-ubuntu-14:/usr/local/apache2/conf$ sudo openssl req        -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt
Generating a 2048 bit RSA private key
.............+++
..................+++
writing new private key to 'domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.dev
Email Address []:

关键部分是:

Common Name (e.g. server FQDN or YOUR name) []:*.dev

第二。

服务器配置:

Listen 443

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile "/usr/local/apache2/conf/domain.crt"
  SSLCertificateKeyFile "/usr/local/apache2/conf/domain.key"

  VirtualDocumentRoot /home/mindaugas/websites/%-2/pubic/
  ServerAlias *.dev
  <Directory "/">
      Options Indexes FollowSymLinks MultiViews
      AllowOverride All
      Allow from All
      Require all granted
  </Directory>
</VirtualHost>

启用ssl并重启apache:

sudo a2enmod ssl
sudo service apache2 restart

您可以通过以下方式测试:

  • 创建两个文档文件结构;
  • 使用简单的HTML页面填充它们;
  • 通过在hosts文件中提供domain-ip映射来发出请求,或者像我一样,通过在需要时发出不同的主机头来修改“修改头”插件:

enter image description here