在 Apache 中的不同 VirtualHosts 上显示自定义错误页面

Mr *_*eph 4 reverse-proxy virtualhost custom-errors apache-2.2

我有一个反向代理 Apache,它将请求移动到 Tomcat servlet。Apache中虚拟主机上的配置是:

<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>
Run Code Online (Sandbox Code Playgroud)

本质上,如果涉及到10.10.10.10和 requests ,则将其/Site1/ServLet1路由到/Site1/ServLet1.

如果我添加

<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>
Run Code Online (Sandbox Code Playgroud)

所以它会显示一个自定义错误site1(我设置了 ErrorDocument),它将被提供给两者。

如何在每个站点维护这种配置的情况下拥有不同的 404 错误页面?

谢谢

编辑:

如果我根据以下评论修改配置,例如:

<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>
Run Code Online (Sandbox Code Playgroud)

然后我仍然可以到达http://1.1.1.1/Site1/ServLet1但没有显示任何错误页面

Sha*_*den 5

我不知道你所说的“不同VirtualHosts”的意思,因为这些都在同一个..但我想你会想要做这样的事情(和考虑移动ProxyPass报表到<Location>块也一样,如果你能) :

<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>
Run Code Online (Sandbox Code Playgroud)

编辑:

要将Proxy语句驻留在位置块中:

<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>
Run Code Online (Sandbox Code Playgroud)


use*_*517 5

使每个虚拟主机都有自己的 VirtualHost 定义。

<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>
Run Code Online (Sandbox Code Playgroud)

您还需要确保您有一个合适的NameVirtualHost定义。

  • 我认为如果你做基于名称的虚拟主机事情会更简单。 (2认同)