Displaying custom error pages on different VirtualHosts in Apache
Solution 1
I'm not sure what you mean by "different VirtualHosts", since these are in the same one.. but I think you'll want to do something like this (and consider moving the ProxyPass
statements into the <Location>
blocks too, if you can):
<VirtualHost 10.10.10.10:80>
ProxyPass /Site1/ServLet1 http://1.1.1.1/Site1/ServLet1
ProxyPassReverse /Site1/ServLet1 http://1.1.1.1/Site1/ServLet1
<Location /Site1>
ErrorDocument 404 /customerrors/site1/404.html
</Location>
ProxyPass /Site2/ServLet2 http://2.2.2.2/Site2/ServLet2
ProxyPassReverse /Site2/ServLet2 http://2.2.2.2/Site2/ServLet2
<Location /Site2>
ErrorDocument 404 /customerrors/site2/404.html
</Location>
</VirtualHost>
Edit:
To have the Proxy
statements reside in the location blocks:
<VirtualHost 10.10.10.10:80>
<Location /Site1>
ErrorDocument 404 /customerrors/site1/404.html
</Location>
<Location /Site1/ServLet1>
ProxyPass http://1.1.1.1/Site1/ServLet1
ProxyPassReverse http://1.1.1.1/Site1/ServLet1
</Location>
<Location /Site2>
ErrorDocument 404 /customerrors/site2/404.html
</Location>
<Location /Site2/ServLet2>
ProxyPass http://2.2.2.2/Site2/ServLet2
ProxyPassReverse http://2.2.2.2/Site2/ServLet2
</Location>
</VirtualHost>
Solution 2
Make it so that each vhost has it's own VirtualHost definition.
<VirtualHost 10.10.10.10:80>
Servername site1.tld
ProxyPass /Site1/ServLet1 http://1.1.1.1/Site1/ServLet1
ProxyPassReverse /Site1/ServLet1 http://1.1.1.1//Site1/ServLet1
ErrorDocument 404 /customerrors/site2/404.html
</VirtualHost>
<VirtualHost 10.10.10.10:80>
ServerName site2.tld
ProxyPass /Site2/ServLet2 http://2.2.2.2/Site2/ServLet2
ProxyPassReverse /Site2/ServLet2 http://2.2.2.2/Site1/ServLet1
ErrorDocument 404 /customerrors/site2/404.html
</VirtualHost>
You'll also need to ensure that you have a suitable NameVirtualHost definition.
Related videos on Youtube
Mr Aleph
Updated on September 18, 2022Comments
-
Mr Aleph almost 2 years
I have a reverse proxy Apache that is moving the request to a Tomcat servlet. The configuration on the Virtual Host in Apache is:
<VirtualHost 10.10.10.10:80> ProxyPass /Site1/ServLet1 http://1.1.1.1/Site1/ServLet1 ProxyPassReverse /Site1/ServLet1 http://1.1.1.1//Site1/ServLet1 ProxyPass /Site2/ServLet2 http://2.2.2.2/Site2/ServLet2 ProxyPassReverse /Site2/ServLet2 http://2.2.2.2/Site1/ServLet1 </VirtualHost>
Essentially, if it comes to
10.10.10.10
and requests/Site1/ServLet1
, route it to/Site1/ServLet1
.if I add
<VirtualHost 10.10.10.10:80> ProxyPass /Site1/ServLet1 http://1.1.1.1/Site1/ServLet1 ProxyPassReverse /Site1/ServLet1 http://1.1.1.1//Site1/ServLet1 ErrorDocument 404 /customerrors/site1/404.html ProxyPass /Site2/ServLet2 http://2.2.2.2/Site2/ServLet2 ProxyPassReverse /Site2/ServLet2 http://2.2.2.2/Site1/ServLet1 </VirtualHost>
so it will show a custom error for
site1
(I set the ErrorDocument), it will be served to both.How can I have a different 404 error page per site maintaining this kind of configuration?
Thank
Edit:
if I modify the configuration based on the comments below like:
<Location /Site1/ServLet1/> ProxyPass http://1.1.1.1/Site1/ServLet1 ProxyPassReverse http://1.1.1.1/Site1/ServLet1 ErrorDocument 404 /customerrors/site1/404.html </Location>
Then I can still get to
http://1.1.1.1/Site1/ServLet1
but no error page is displayed whatsoever -
Mr Aleph over 12 yearsIt doesn't work. I added
<Location /Site1>
and when I browse toSite2
I still see the error forSite1
. Also addingProxyPass
inside theLocation
tags gives me an errorProxyPass|ProxyPassMatch can not have a path when defined in a location.
-
Mr Aleph over 12 yearswhat I want to do is that if the user browses to
10.10.10.10/Site1/ServLet1
then everything is fine, if he browses to10.10.10.10/Site1/AnyOtherPage
then display error. This needs to be done per page -
Mr Aleph over 12 yearsI still get ProxyPass|ProxyPassMatch can not have a path when defined in a location. I'm confused now, could write a little sample or modify the one in your answer?
-
Mr Aleph over 12 yearsI don't have a servername, they are all IP addresses
-
Mr Aleph over 12 yearssuch as? Can you modify your example to show me what you mean'
-
Mr Aleph over 12 yearsSee comments on my question. I passes the request via the reverse proxy to
http://1.1.1.1/Site1/ServLet1
but it doesn't show any error page -
ravi yarlagadda over 12 years@MrAleph Edited, try that.
-
Mr Aleph over 12 yearsStill. It doesn't show any error page.
-
ravi yarlagadda over 12 years@MrAleph It would mean using a different hostname for servlet;
site1.example.com
instead ofexample.com/site1/servlet1
- and I agree, that approach might simplify things future changes and maintenance.