This page was served because your request carried the header
Host: apache-a.srv1957161.hstgr.cloud. Apache compared that value against every
ServerName it knows, matched this virtual host, and served the index file from
this vhost's document root.
| Setting | Value |
|---|---|
| Server | Apache/2.4 (Alpine) |
ServerName | apache-a.srv1957161.hstgr.cloud |
DocumentRoot | /var/www/site-a |
| This file | /var/www/site-a/index.html |
| Directory listing | Options -Indexes (off) |
<VirtualHost *:80>
ServerName apache-a.srv1957161.hstgr.cloud
DocumentRoot /var/www/site-a
<Directory /var/www/site-a>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# deliberate 403 -- file exists, config refuses
<Directory /var/www/site-a/forbidden>
Require all denied
</Directory>
</VirtualHost>
403 Forbidden → 404 Not Found → Same server, vhost B →
/forbidden/index.html genuinely exists on disk. It returns 403 because
Require all denied applies to that directory — the classic case where the file is fine and
the config is the problem. Compare with the 404, where the vhost matched correctly but the path
does not exist.
curl -sI https://apache-a.srv1957161.hstgr.cloud/ | head -1
curl -s -o /dev/null -w '%{http_code}\n' https://apache-a.srv1957161.hstgr.cloud/forbidden/
curl -s -o /dev/null -w '%{http_code}\n' https://apache-a.srv1957161.hstgr.cloud/nope
# on the server itself:
apachectl -S # every vhost, and the file:line that defined it
apachectl configtest # syntax check before any reload