Использование 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
context), любые переменные среды, которые устанавливаются на начальном этапе, имеют префикс 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
env var устанавливается на первом этапе обработки, а Header
Директива обрабатывается поздно на 2-м (или 3-м ...) этапе обработки.
Если есть дополнительные циклы перезаписи (маловероятно), тогда этот env var далее переименовывается в 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 ...).