Назад | Перейти на главную страницу

Установить заголовки в apache2, если URL-адрес содержит термин

Использование 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-адреса могут выглядеть так:

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 ...).