Для . хорошо известного пути я хочу вернуть статический файл / строку 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>
В ответ на креативный ответ @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
Обратите внимание, что всегда
условие на директиве Header
необходимо в этом случае.
Однако приведенное выше решение допускает только один ответ (т.е. ErrorDocument 200
), если у вас есть другие URL, требующие другого ответа. Если вы объявите еще один ErrorDocument 200
позже, он отменит предыдущее определение, независимо от порядка следования директив.
Вместо этого можно "охватить" ErrorDocument
и связанные с ним директивы по URL-пути, используя блок
. Это также позволяет избежать необходимости mod_rewrite и дополнительных env var. Например:
<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
не будет иметь никакого эффекта.)
Да, это возможно (в Apache 2.4).
Просто добавьте следующие директивы:
ErrorDocument 200 "{\"foo\": \"bar\"}"
RewriteEngine On
RewriteRule "^/.well-known/foo$" - [R=200,L]
К сожалению (насколько мне известно) невозможно установить Content-Type и добавить собственные заголовки.
Помните, что ErrorDocument с 2xx и 3xx недокументирован и может измениться.
Вместо того, чтобы вставлять контент непосредственно в директиву 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"}
.