I have a VPS running lamp with virtual hosts enabled. Virtual hosts works great except for one domain for which it’s A record goes through Cloudflare. When trying to access that domain the apache server returns the default configuration instead of the specific domain configuration.
From looking at apache logs it seems to me that the request going through Cloudflare does not provide the server with the domain name requested. (basically it doesn’t say to the server show me xyz.com domain - it just says show me the web page and the server returns the default configuration)
When the Cloudflare proxy service is disabled on the A records in the DNS section the website works as expected without any issues.
What would be a correct configuration for using Cloudflare with multiple virtual hosts on apache 2.4?
No reason that shouldn’t work, works for me (and presumably thousands of people who host on things cloud platforms that also reply on a host being passed in the header). Can you share your Apache config?
Sure, here is my config…nothing special…without cloudflare works great, it’s very strange.
My apache2.conf:
# Global configuration
#
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /sh/>
AllowOverride None
Require all granted
</Directory>
<Directory /www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" $
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combin$
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
ServerName sub.domainname.com
My virtual host file for the specific domain:
<VirtualHost domainname.com:80>
# The ServerName directive sets the request scheme, hostname and port t$
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
ServerName domainname.com
ServerAlias www.domainname.com
ServerAdmin [email protected]
DocumentRoot /www/public_html/domainname
<Directory "/www/public_html/domainname">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
php_admin_value open_basedir "/www/public_html/domainname/:/temp"
</Directory>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/domainname-error.log
CustomLog ${APACHE_LOG_DIR}/domainname-access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Let me know if you notice something that shouldn’t be there. This issue has been stopping me from using cloudflare for quite some time now.
Thank you for replying. Fortunately I managed to figure it out myself. Cloudflare sends the correct host and the issue sits in Apache.
Here is the solution for other users having the same issue:
Turns out that Apache needs to be able to resolve the hostname as set in the virtual host file to its own IP. Since Cloudflare hides the server IP when using the proxy service (the orange cloud), Apache cannot resolve the hostname to itself and for some reason doesn’t use the configuration file for that specific domain thus delivering the default virtual host file. To fix this you need to add the domain that is using Cloudflare to the hosts file of the server, pointing it at itself.
I hope that makes sense.
Thank you to everyone who replied and I hope this will help anybody facing the same issue.