Использование Apache 2.4.29 и поиск заголовков, если URL-адрес содержит определенный термин (api).
Вот моя попытка, которую я установил в файле конфигурации
RewriteEngine On
RewriteCond %{REQUEST_URI} api ENV=SIGN2
Header set "Access-Control-Allow-Origin" "*" env=SIGN2
Header set "Access-Control-Allow-Headers" "*" env=SIGN2
Я также пробовал:
SetEnvIf REQUEST_URI ".*api.*" SIGN
Header set Access-Control-Allow-Origin "*" env=SIGN
Header set Access-Control-Allow-Headers "*" env=SIGN
но это не сработало.
URL-адреса могут выглядеть так:
https://www.example.com/api/something/another/last
Это должно
установите заголовки
https://test.example.com/api/something/another/last
Это должно
установите заголовки
https://prod.example.com/api/something/another/last
Это должно
установите заголовки
https://www.example.com/hello/world/test
Этого не должно быть.
примеры URL-адресов не указывают на фактические каталоги.
В этом случае запрос, вероятно, перезаписывается фронт-контроллеру, который направляет вызов API?
Когда выполняется процесс перезаписи "циклы" после первой перезаписи (в контексте каталога / .htaccess
), любые переменные среды, установленные на начальном этапе, имеют префикс REDIRECT_
. Итак, как в вашем примере, SIGN
переименован в REDIRECT_SIGN
. Так что, вероятно, нужно проверять именно эту переменную среды, а не SIGN
.
Например:
SetEnvIf Request_URI "^/api" SIGN
Header set Access-Control-Allow-Origin "*" env=REDIRECT_SIGN
Header set Access-Control-Allow-Headers "*" env=REDIRECT_SIGN
Для запросов, которые запускают / api
.
Это может показаться нелогичным, но в контексте каталога переменная окружения SIGN
устанавливается на первом этапе обработки, а директива Заголовок
обрабатывается поздно на 2-я (или 3-я ...) фаза обработки.
Если есть дополнительные циклы перезаписи (маловероятно), тогда эта переменная env дополнительно переименовывается в REDIRECT_REDIRECT_SIGN
и т. Д.
Это не проблема, если директивы находятся непосредственно в конфигурации основного сервера или виртуального хоста.
RewriteCond% {REQUEST_URI} api ENV = SIGN2
Между прочим, это полностью недействительно и может сломать ваш сервер. Вы устанавливаете переменные среды с помощью директивы RewriteRule
, как указал @EOhm.
Я не знаю о SetEnvIf, но для mod_rewrite я могу сказать Вам, что должно работать (мы все равно используем mod_rewrite, поэтому его можно использовать для всего, что он предоставляет).
RewriteEngine On
RewriteRule ^/api(/.*)?$ - [E=SIGN2:1]
Header set Access-Control-Allow-Origin "*" env=SIGN2
Header set Access-Control-Allow-Headers "*" env=SIGN2
RewriteCond не предлагает возможности изменить среду, отличную от того, что я знаю (он предназначен для использования в качестве фильтрации и некоторой ограниченной предварительной обработки для RewriteRule).
Этот механизм работает. Могут быть некоторые угловые случаи, когда кажется, что он не работает и требует модификации, поэтому, если это не сработает, вы должны указать, что вы получаете вместо ожидаемого.
Кроме того, по крайней мере, с Apache 2.2 я уверен, ошибка документации. Вам нужно установить для переменной явное значение (например, 1
в моем примере), если вы используете Mod, чтобы директива заголовка mod_header распознала его (мысль, что mod_rewrite заявляет, что устанавливает переменную, даже если значение не указано , а в заголовке указано, что он просто проверяет, установлена ли переменная - мне потребовалось некоторое время, чтобы выяснить, почему такая cinstruct не работает ...).