Ubuntu Apache2如何配置多级多域名虚拟主机!

Ubuntu Apache2如何配置多级多域名虚拟主机!

Scroll Down

其实这个问题很久以前就开始困扰我了,不过之前没什么心思认真解决这个问题,都是靠走了点弯路来解决。。。

就是Apache2的虚拟机配置,比如:

  • xy718.xyz
  • a.xy718.xyz
  • b.xy718.xyz

  以及他们的80端口转发443端口等等这种靠修改site-enable配置来实现多虚拟主机的问题。

  相信这个问题也困扰了很多人,而且大家也会有人像我一样网上收集了大量的资料,但是却无果的人,因为大部分人的博客都是复制粘贴草草了事,全都是别人写过的内容。
  这篇博客我就对Apache2如何监听多个顶级域名相同的二级域名来写一篇解决心得。

阅读本篇博客

 你不能获得

  • Apache2如何配置端口转发
  • Apache2如何部署网站
  • Apache2如何配置SSL

 你可以获得

  • Apache2如何配置多个顶级域名相同的二级域名的虚拟主机

解决的办法非常的简单,以及她产生的原因也非常的简单

  做过Java开发的同学都知道(当然不止Java)LinkedHashMap,她是一个有序的HashMap,在一般的RESTful接口,Web接口等需要链式过滤的环境下就需要用到LinkedHashMap
  其实Apache2的虚拟主机匹配机制也是如此,是根据你在site-enable中配置的顺序来决定链式过滤的。

(看到这是不是有点懂了?)

是的没错
当你在虚拟主机配置中配置顺序为:

  • xy718.xyz
  • a.xy718.xyz
  • b.xy718.xyz

时:
若你访问b.xy718.xyz你将会被Apache2定向到xy718.xyz,因为在链式过滤中,你的"b"被匹配为了"*"所以导致了你的虚拟主机访问不到。
但是换一种顺序:

  • a.xy718.xyz
  • b.xy718.xyz
  • xy718.xyz

这时,不论你访问这三个中的其中一个,都是可以成功访问的。。。。
这就是我一直以来在Apache2虚拟主机配置中踩的坑!

最后附上我的实际虚拟主机配置,更加直观一点:

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerName spongedocs.xy718.xyz
                ServerAlias spongedocs.xy718.xyz
                DocumentRoot "/var/www/spongedocs"
                ErrorLog ${APACHE_LOG_DIR}/spongedocs/error.log
                CustomLog ${APACHE_LOG_DIR}/spongedocs/access.log combined
                SSLEngine on
                SSLCertificateFile /etc/apache2/ssl/spongedocs/2_spongedocs.xy718.xyz.crt
                SSLCertificateKeyFile /etc/apache2/ssl/spongedocs/3_spongedocs.xy718.xyz.key
                SSLCertificateChainFile /etc/apache2/ssl/spongedocs/1_root_bundle.crt
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
                SetEnv nokeepalive ssl-unclean-shutdown
        </VirtualHost>

        <VirtualHost *:443>
                ServerName paste.xy718.xyz
                ServerAlias paste.xy718.xyz
                DocumentRoot "/var/www/paste.tech"
                ErrorLog ${APACHE_LOG_DIR}/pastetech/error.log
                CustomLog ${APACHE_LOG_DIR}/pastetech/access.log combined
                SSLEngine on
                SSLCertificateFile /etc/apache2/ssl/paste/2_paste.xy718.xyz.crt
                SSLCertificateKeyFile /etc/apache2/ssl/paste/3_paste.xy718.xyz.key
                SSLCertificateChainFile /etc/apache2/ssl/paste/1_root_bundle.crt
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
                SetEnv nokeepalive ssl-unclean-shutdown

        </VirtualHost>

        <VirtualHost *:443>
                ServerAdmin jin@xy718.xyz
    		ServerName xy718.xyz
    		ServerAlias xy718.xyz

    		#反向代理设置
    		ProxyPass / http://XXX:8090/
    		ProxyPassReverse / http://XXX:8090/
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
                SSLEngine on
                SSLCertificateFile /etc/apache2/ssl/3232394_xy718.xyz_public.crt
                SSLCertificateKeyFile /etc/apache2/ssl/3232394_xy718.xyz.key
                SSLCertificateChainFile /etc/apache2/ssl/3232394_xy718.xyz_chain.crt
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
                SetEnv nokeepalive ssl-unclean-shutdown
        </VirtualHost>
</IfModule>

希望我的这篇博客可以帮到你大忙!!!