Apache:返回位置的静态字符串

ano*_*4.1 3 mod-rewrite web-server apache-2.4 apache2

对于.well-known路径,我想返回一个静态 JSON 文件/字符串。

使用 nginx,这似乎是可能的,而无需通过在配置文件中指定内容来创建该文件:

location /.well-known/foo {
    return 200 '{"foo": "bar"}';
    default_type application/json;
    add_header Access-Control-Allow-Origin *;
}
Run Code Online (Sandbox Code Playgroud)

apache 有类似的可能吗?这是我到目前为止:

<Location "/.well-known/foo">
        # return '{"foo": "bar"}'
        ForceType application/json
        Header set Access-Control-Allow-Origin *
</Location>
Run Code Online (Sandbox Code Playgroud)

小智 5

是的,这是可能的(在 Apache 2.4 中)。

只需添加以下指令:

ErrorDocument 200 "{\"foo\": \"bar\"}"
RewriteEngine On
RewriteRule "^/.well-known/foo$" - [R=200,L]
Run Code Online (Sandbox Code Playgroud)

不幸的是,(据我所知)不可能设置Content-Type并添加自定义标题。

请注意带有 2xx 和 3xx 的 ErrorDocument 未记录并且可能会更改。


MrW*_*ite 5

除了@João Alves 创意答案之外,您还可以Content-Type通过在 上设置环境变量RewriteRule并使用Header指令根据此环境变量有条件地设置这些标头来设置适当的和其他自定义标头。

例如:

ErrorDocument 200 '{"foo": "baz"}'

RewriteEngine On

# Trigger the 200 response AND set an environment variable "JSON"
RewriteRule ^/\.well-known/foo$ - [R=200,E=JSON:1,L]

# Set headers if "JSON" env var is set
Header always set Access-Control-Allow-Origin * env=JSON
Header always set Content-Type application/json env=JSON
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,指令上的always 条件Header是必要的。

但是,ErrorDocument 200如果您应该有其他需要不同响应的 URL ,则上述解决方案仅允许单个响应(即)。如果ErrorDocument 200稍后声明另一个,它将覆盖先前的定义,而不管指令的顺序如何。

您可以改为ErrorDocument使用<Location>块通过 URL 路径“作用域”和相关指令。这也避免了 mod_rewrite 和额外的环境变量的需要。例如:

<Location /.well-known/foo>
    ErrorDocument 200 '{"foo": "bar"}'
    Redirect 200 /
    Header always set Content-Type application/json
    Header always set Access-Control-Allow-Origin *
</Location>
Run Code Online (Sandbox Code Playgroud)

(由于此请求未映射到静态文件,ForceType因此在此处无效。)