繁体   English   中英

Apache 规则基于 http 状态和响应状态

[英]Apache rule based on http status and on response status

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

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

在文档页面上,我找到了一个基于用户代理( HTTP_USER_AGENT )的变量,但没有找到 http 状态的变量。 那可能吗?

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

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

When an absolute URL is used in the ErrorDocument directive, it will trigger a 302 (temporary) redirect to that URL should the stated HTTP response status be triggered by Apache.

因此,当带有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 中),那么上述规则将不会捕获到。

文档页面提到了以下环境变量:

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 状态的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM