Apache: вернуть статическую строку для местоположения

Для . хорошо известного пути я хочу вернуть статический файл / строку 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>
3
задан 29 April 2021 в 19:53
3 ответа

В ответ на креативный ответ @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 не будет иметь никакого эффекта.)

5
ответ дан 7 May 2021 в 18:08

Да, это возможно (в Apache 2.4).

Просто добавьте следующие директивы:

ErrorDocument 200 "{\"foo\": \"bar\"}"
RewriteEngine On
RewriteRule "^/.well-known/foo$" - [R=200,L]

К сожалению (насколько мне известно) невозможно установить Content-Type и добавить собственные заголовки.

Помните, что ErrorDocument с 2xx и 3xx недокументирован и может измениться.

5
ответ дан 7 May 2021 в 18:08

Вместо того, чтобы вставлять контент непосредственно в директиву 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"} .

0
ответ дан 7 May 2021 в 18:08

Теги

Похожие вопросы