【问题标题】:Apache rule based on http status and on response status基于 http 状态和响应状态的 Apache 规则
【发布时间】:2022-01-22 00:46:17
【问题描述】:

我想根据用户代理和 http 响应创建一个 apache 规则。

例如,我想要这样一条规则:如果 user-agent=test 并且请求的状态基于此 user agent=503,则将请求重定向到 /home

On the documentation page, 我找到了一个基于用户代理的变量(HTTP_USER_AGENT),但没有找到 http 状态的变量。 这可能吗?

【问题讨论】:

  • 这取决于 503 的触发方式。 503是怎么触发的?例如,如果这是由您的应用程序(而不是 Apache)设置的,则您不能随意检查 Apache 中的 HTTP 响应状态。 (尽管如果您知道什么会触发该响应,则不一定需要检查实际响应代码。)
  • 首先加载页面,然后在此页面上执行不同的请求(由该特定用户代理执行)
  • 但是你一开始是如何设置 503 响应状态的呢?如果您在 Apache 中设置此状态码(预计为 503),您可以检测到状态码,但从您的评论来看,情况可能并非如此(尽管尚不清楚)?
  • 我不想设置http状态,我想检查这些查询的结果(http状态)是什么。

标签: apache mod-rewrite


【解决方案1】:

您可以执行以下操作,以在发送带有 User-Agent“测试”的请求时定义自定义 503“错误文档”:

<If "%{HTTP_USER_AGENT} == 'test'">
    ErrorDocument 503 https://example.com/home
</If>

当在ErrorDocument 指令中使用绝对 URL 时,如果所述 HTTP 响应状态由 Apache 触发,它将触发 302(临时)重定向到该 URL。

因此,当带有User-Agent "test" 的请求在 Apache 中触发 503 响应时,上面将发出外部重定向到 /home

这需要在主服务器配置(不是.htaccess)中定义,以便有机会捕获服务器生成的任意 503。尽管这是否会捕获这样一个“意外”错误是值得怀疑的,因为 503 - 如果由服务器本身触发 - 是一个相当严重/致命的错误。通常,503 是当应用程序进入“维护模式”时的受控响应。在这种情况下,您可能会以不同的方式处理。

或者,REDIRECT_STATUS 环境变量保存 HTTP 响应状态代码,因此您可以使用 mod_rewrite 执行以下操作来覆盖 ErrorDocument 并触发302重定向到/home:

RewriteEngine On    

RewriteCond %{ENV:REDIRECT_STATUS} =503
RewriteCond %{HTTP_USER_AGENT} "=test"
RewriteRule ^ /home [R=302,L]

如果 503 是由应用程序本身触发的(例如在 PHP 中),则上述规则不会捕获到。

【讨论】:

    【解决方案2】:

    The documentation page 提到以下环境变量:

    HTTP_ACCEPT
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_REFERER
    HTTP_USER_AGENT
    AUTH_TYPE
    CONN_REMOTE_ADDR
    CONTEXT_PREFIX
    CONTEXT_DOCUMENT_ROOT
    IPV6
    PATH_INFO
    QUERY_STRING
    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_IDENT
    REMOTE_PORT
    REMOTE_USER
    REQUEST_METHOD
    SCRIPT_FILENAME
    DOCUMENT_ROOT
    SCRIPT_GROUP
    SCRIPT_USER
    SERVER_ADDR
    SERVER_ADMIN
    SERVER_NAME
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION
    CONN_REMOTE_ADDR
    HTTPS
    IS_SUBREQ
    REMOTE_ADDR
    REQUEST_FILENAME
    REQUEST_SCHEME
    REQUEST_URI
    THE_REQUEST
    

    很遗憾,我找不到任何显示 HTTP 状态的变量。

    【讨论】:

    • 是的,我已经看到了。这是否意味着我走上了死胡同?
    • @Warok 是的。但不完全,因为您仍然可以编辑 Apache HTTP Server 本身的源代码,并在那里添加重定向。 (但您需要了解 C 和 Apache HTTP Server 本身)
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2012-06-12
    • 2021-12-26
    相关资源
    最近更新 更多