为一个。知名路径,我想返回一个静态 JSON 文件/字符串。
使用 nginx,这似乎是可能的,而无需通过在配置文件中指定内容来创建该文件:
location /.well-known/foo {
return 200 '{"foo": "bar"}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
Apache 是否也可能出现类似情况?这是我目前所拥有的:
<Location "/.well-known/foo">
# return '{"foo": "bar"}'
ForceType application/json
Header set Access-Control-Allow-Origin *
</Location>
答案1
除@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
请注意always
状况在这种情况下,该Header
指令是必要的。
ErrorDocument 200
但是,如果您有其他需要不同响应的 URL,上述解决方案仅允许单个响应(即)。如果您ErrorDocument 200
稍后声明另一个,它将覆盖先前的定义,无论指令的顺序如何。
您可以ErrorDocument
使用块通过 URL 路径“限定”和相关指令的范围<Location>
。这还可以避免使用 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>
(由于此请求未映射到静态文件,因此ForceType
此处不会产生任何效果。)
答案2
是的,这是有可能的(在 Apache 2.4 中)。
只需添加以下指令:
ErrorDocument 200 "{\"foo\": \"bar\"}"
RewriteEngine On
RewriteRule "^/.well-known/foo$" - [R=200,L]
不幸的是(据我所知)不可能设置内容类型并添加自定义标题。
请注意,2xx 和 3xx 的 ErrorDocument 尚未记录并且可能会发生变化。
答案3
您不需要将内容直接插入 Apache 指令中,而是可以将内容放在文件中并使用别名:
Alias /.well-known/foo /path/to/content.json
<Location "/.well-known/foo">
ForceType application/json
Header set Access-Control-Allow-Origin *
</Location>
其中 content.json 是包含您的内容的文件{"foo": "bar"}
。
答案4
更好的解决方案是使用mod_lua
。这也消除了对 的需求mod_rewrite
(httpd
文档不鼓励这样做)。请参阅https://gist.github.com/james2doyle/f09b0e159bb30836e593举个例子。