Apache mod-proxy ProxyErrorOverride для определенных шаблонов URL
Я использую Apache 2.2 с mod-proxy, и я настроил его с несколькими утверждениями ProxyPass для прокси-сервера с удаленного URL-адреса на локальный URL-адрес. Мне нужно иметь пользовательские документы ошибок, возвращенные из Apache для этих проксированных URL-адресов, поэтому я устанавливаю "ProxyErrorOverride On" в моей конфигурации mod-proxy вместе с некоторыми директивами ErrorDocument (с локальным URL-адресом), чтобы возвращать страницы пользовательских ошибок для нескольких кодов статуса HTTP интерес. Однако, когда возвращается код состояния, для которого я НЕ создал директиву ErrorDocument, Apache заменяет тело ответа на страницу ошибок по умолчанию, вместо того чтобы оставить исходный тело ответа неповрежденным. Это не будет работать с приложением. Поэтому у меня действительно есть 2 вопроса:
1) Возможно ли настроить Apache, чтобы оставить исходный корпус ответа неповрежденным для определенного кода состояния, если у меня нет переопределения ErrorDocument, определенного для него?
2) Возможно ли, чтобы директива ProxyErrorOverride применима только к некоторым URL-адресам в моих заявлениях ProxyPass?
Ответы
Ответ 1
Как указывал arober11 в комментарии выше:
Испуганный ответ: Нет и Нет. Если директива может быть ограничена местоположение, каталог или набор URL-адресов, тогда будет что-то в разделе "Контекст" на странице руководства: httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxyerroroverride
с другой стороны: вы всегда можете добавить его в mod_proxy.c самостоятельно.
Ответ 2
Для вопроса 2:
Определенно выполнимо. Используя внутренние переадресации на новый хост или порт, это возможно. Краткая схема с использованием хостов (добавьте noErrorOverrideUrl, doErrorOverrideUrl в DNS или /etc/hosts apache-machine):
NameVirtualHost *:80
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^(/noErrorOverrideUrl/.*) http://noErrorOverrideUrl$1 [L,P]
RewriteRule ^(/doErrorOverrideUrl/.*) http://doErrorOverrideUrl$1 [L,P]
</VirtualHost>
<VirtualHost *:80>
ServerName noErrorOverrideUrl
ProxyErrorOverride Off
ProxyPass ...
...
</VirtualHost>
<VirtualHost *:80>
ServerName doErrorOverrideUrl
ProxyErrorOverride On
ProxyPass ...
...
</VirtualHost>
Краткое описание с использованием портов:
Listen 80
Listen 81
Listen 82
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^(/noErrorOverrideUrl/.*) http://server:81$1 [L,P]
RewriteRule ^(/doErrorOverrideUrl/.*) http://server:82$1 [L,P]
</VirtualHost>
<VirtualHost *:81>
ProxyErrorOverride Off
ProxyPass ...
...
</VirtualHost>
<VirtualHost *:82>
ProxyErrorOverride On
ProxyPass ...
...
</VirtualHost>
Ответ 3
Вы можете обновить apache и использовать предложение If, доступное для 2. 4+
<VirtualHost *:80>
...
<If "%{REQUEST_URI} =~ m#^\/QA(.*)$#">
ProxyErrorOverride Off
</If>
..
</VirtualHost>
Документация