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

  • 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 Этого не должно быть.

1
задан 27 October 2019 в 17:21
2 ответа

примеры 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.

1
ответ дан 3 December 2019 в 22:59

Я не знаю о 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 не работает ...).

0
ответ дан 3 December 2019 в 22:59

Теги

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