其实这个问题很久以前就开始困扰我了,不过之前没什么心思认真解决这个问题,都是靠走了点弯路来解决。。。
就是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>
希望我的这篇博客可以帮到你大忙!!!
冶心·练体·得技