Apache virtual host serves default vhost for port 443 despite server name match for port 80
I have two servers that are clones of each other save for a few minor configuration changes. I am getting some unexpected behaviour when trying to visit their monitoring.*.com sub domains.
Running ./apache2ctl -S
on each server gives the following:
Staging Server
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 is a NameVirtualHost
default server 010.staging.com (/etc/apache2/sites-enabled/010:2)
port 443 namevhost 010.staging.com (/etc/apache2/sites-enabled/010:2)
port 443 namevhost 011.staging.com (/etc/apache2/sites-enabled/011:2)
port 443 namevhost 013.staging.com (/etc/apache2/sites-enabled/013:2)
*:80 is a NameVirtualHost
default server www.production.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost www.production.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost monitoring.staging.com (/etc/apache2/sites-enabled/monitoring:1)
Syntax OK
Production Server
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 is a NameVirtualHost
default server de.production.com (/etc/apache2/sites-enabled/de:2)
port 443 namevhost de.production.com (/etc/apache2/sites-enabled/de:2)
port 443 namevhost uk.production.com (/etc/apache2/sites-enabled/uk:2)
port 443 namevhost us.production.com (/etc/apache2/sites-enabled/us:2)
port 443 namevhost www.production.com (/etc/apache2/sites-enabled/production:2)
*:80 is a NameVirtualHost
default server www.production.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost www.production.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost monitoring.production.com (/etc/apache2/sites-enabled/monitoring:1)
Syntax OK
The configuration of 000-default is as follows on both servers
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName www.production.com
DocumentRoot /home/user/apache/
RewriteEngine on
RewriteLog /var/log/apache2/log
RewriteLogLevel 1
RewriteCond %{REQUEST_URI}/ !^(/server-status).*$
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>
The problem I am having is that when I visit http://monitoring.staging.com
I am being redirected to http**s**.monitoring.staging.com
and being served the app for 010.staging.com
the default secure port server.
The production server is behaving as expected and serving my application monitoring tool.
As I said both these servers started out as clones of a master image with only very minor configuration changes – I can describe specific changes if needed.
Can anyone hazard any guesses why I am seeing this behaviour?
Thank you
Updates:
This is the Vhost config for monitoring:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName monitoring.staging.com
DocumentRoot /var/www/munin
<Directory /var/www/munin>
Options FollowSymLinks
AllowOverride None
</Directory>
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel notice
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
ServerSignature On
</VirtualHost>
And for the app that is actually being served:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName 010.staging.com
RewriteLog /var/log/apache2/ssl.log
RewriteRule ^/$ /010/home.htm [R=301,L]
RewriteRule ^/(?!010/|static/|mgt).*$ /010/home.htm [R=301,L]
SSLCertificateKeyFile /etc/apache2/ssl/010/apache.key
SSLCertificateFile /etc/apache2/ssl/010/apache.crt
SSLCACertificateFile /etc/apache2/ssl/010/apache-ca.crt
</VirtualHost>
</IfModule>
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8728145350222960&output=html&h=280&slotname=3177021931&adk=272958323&adf=4253104653&pi=t.ma~as.3177021931&w=730&fwrn=4&fwrnh=100&lmt=1673427609&rafmt=1&format=730×280&url=https%3A%2F%2Fitecnotes.com%2Fserver%2Fapache-virtual-host-serves-default-vhost-for-port-443-despite-server-name-match-for-port-80%2F&fwr=0&fwrattr=true&rpe=1&resp_fmts=3&wgl=1&uach=WyJXaW5kb3dzIiwiMTQuMC4wIiwieDg2IiwiIiwiMTA4LjAuNTM1OS4xMjUiLFtdLGZhbHNlLG51bGwsIjY0IixbWyJOb3Q_QV9CcmFuZCIsIjguMC4wLjAiXSxbIkNocm9taXVtIiwiMTA4LjAuNTM1OS4xMjUiXSxbIkdvb2dsZSBDaHJvbWUiLCIxMDguMC41MzU5LjEyNSJdXSxmYWxzZV0.&dt=1673427609433&bpp=2&bdt=331&idt=324&shv=r20230109&mjsv=m202212010101&ptt=9&saldr=aa&abxe=1&cookie=ID%3Dd59a178a1aa801d7-2225e38334d90014%3AT%3D1673066277%3ART%3D1673066277%3AS%3DALNI_Mb3cSN-p0MDgPli0_3O6vDHPZREkA&gpic=UID%3D00000b9f1ce05e3d%3AT%3D1673066277%3ART%3D1673246658%3AS%3DALNI_Ma0lpDHYBhwYNa9TK7I9ZLHuhwt9Q&prev_fmts=0x0&nras=1&correlator=570507711579&frm=20&pv=1&ga_vid=1501950077.1673427610&ga_sid=1673427610&ga_hid=1190480190&ga_fc=0&u_tz=420&u_his=1&u_h=1080&u_w=1920&u_ah=1032&u_aw=1920&u_cd=24&u_sd=1&dmc=8&adx=397&ady=2770&biw=1903&bih=929&scr_x=0&scr_y=2037&eid=44759875%2C44759926%2C44759837%2C31071374&oid=2&pvsid=4087462812482878&tmod=282180442&uas=0&nvt=3&ref=https%3A%2F%2Fwww.google.com%2F&eae=0&fc=1920&brdim=0%2C0%2C0%2C0%2C1920%2C0%2C1920%2C1032%2C1920%2C929&vis=1&rsz=%7C%7CpeE%7C&abl=CS&pfx=0&fu=128&bc=31&ifi=2&uci=a!2&fsb=1&xpc=XBJFvo7hzP&p=https%3A//itecnotes.com&dtd=329
Best Answer
I solved this by change the 000-default
config on staging to the follow:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName staging.com
DocumentRoot /home/user/apache/
RewriteEngine on
RewriteLog /var/log/apache2/log
RewriteLogLevel 1
RewriteCond %{REQUEST_URI}/ !^(/server-status).*$
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
</VirtualHost>
The change being the ServerName from www.production.com to staging.com
I don’t know why this fixed the issue so I am more than happy give a correct answer tick to anyone that can explain the behaviour and what Apache is doing.
Related Solutions
Apache Named VirtualHosts with wildcards
Update: * is valid syntax but not necessary. You can find out more here.
This will work though.
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
The first directive will match everything that is not explicitly defined elsewhere.