【问题标题】:Apache mod-proxy ProxyErrorOverride for specific URL patterns特定 URL 模式的 Apache mod-proxy ProxyErrorOverride
【发布时间】:2011-11-27 03:26:16
【问题描述】:

我正在使用带有 mod-proxy 的 Apache 2.2,并且我已经使用几个 ProxyPass 语句对其进行了配置,以从远程 URL 代理到本地 URL。我需要为这些代理 URL 从 Apache 返回自定义错误文档,因此我在我的 mod-proxy 配置中设置“ProxyErrorOverride On”以及一些 ErrorDocument 指令(带有本地 URL 路径)以返回一些 HTTP 状态代码的自定义错误页面兴趣。但是,当返回一个我没有为其创建 ErrorDocument 指令的状态代码时,Apache 会将响应正文替换为默认错误页面,而不是保留原始响应正文。这不适用于应用程序。所以我真的有两个问题:

1) 如果我没有为特定状态代码定义 ErrorDocument 覆盖,是否可以将 Apache 配置为保留原始响应主体不变?

2) 是否可以让 ProxyErrorOverride 指令仅适用于我的 ProxyPass 语句中的某些 URL?

【问题讨论】:

标签: apache mod-proxy


【解决方案1】:

正如 arober11 在上面的评论中指出的那样:

害怕答案是:不,不。如果指令可以限制为 一个位置、目录或一组 URL,那么就会有一些东西 在手册页的“上下文”部分中: httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxyerroroverride

另一方面:您始终可以自己将其添加到 mod_proxy.c。

【讨论】:

    【解决方案2】:

    对于问题 2: 绝对可行。使用内部重定向到新主机或端口这是可能的。使用主机的简要概述(在 DNS 或 apache-machine 的 /etc/hosts 中添加 noErrorOverrideUrl、doErrorOverrideUrl):

    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 并使用 2.4+ 上可用的 If 语句

      <VirtualHost *:80>
        ...
        <If "%{REQUEST_URI} =~ m#^\/QA(.*)$#">
            ProxyErrorOverride Off
        </If>
        ..
      </VirtualHost>
      

      Documentation

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 2014-06-04
        • 2010-11-02
        • 2014-04-18
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多