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

Набор условных заголовков htaccess игнорирует условие

Я пытаюсь установить заголовки, если источником является конкретный сайт, чтобы разрешить конфликт ресурсов, который у меня есть (с использованием Mautic, размещенного на поддомене).

Если я добавляю заголовки для любой ситуации, я получаю ошибку 500 при попытке использовать Mautic, но ресурс, к которому осуществляется доступ с моего сайта, работает, поэтому я хочу устанавливать их только тогда, когда мой сайт является источником.

Вот что у меня есть:

RewriteEngine On
#preserve HTTP(S)
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]

<IfModule mod_headers.c>
    SetEnvIfNoCase Origin %{ENV:proto}://mysite.com ENV_SET
    SetEnvIfNoCase Origin %{ENV:proto}://mautic.mysite.com ENV_SET=0
    Header add Access-Control-Allow-Origin %{ENV:proto}://mysite.com env=ENV_SET
    Header set Access-Control-Allow-Credentials true env=ENV_SET
    Header set Access-Control-Allow-Methods: GET, POST, PATCH, PUT, OPTIONS env=ENV_SET
    Header set Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token env=ENV_SET
</IfModule>

Насколько я понял, при этом заголовки будут устанавливаться условно при наличии переменной окружения, но они устанавливаются несмотря ни на что. Если я удалю строки SetEnvIf, они все равно будут установлены. Я нашел этот что предполагает, что его следует поместить в конфигурацию вместо .htaccess, но я не уверен, что это значит.

Любые предложения о том, как я могу это исправить, или другой способ заставить это работать?

Спасибо

РЕДАКТИРОВАТЬ: синтаксис обновлен с учетом рекомендаций от w3dk, теперь выглядит как

    SetEnvIfNoCase Origin "%{ENV:proto}://mysite.com" ENV_SET
    SetEnvIfNoCase Origin "%{ENV:proto}://mautic.mysite.com" !ENV_SET
    Header set Access-Control-Allow-Origin "%{ENV:proto}://mysite.com" env=ENV_SET
    Header set Access-Control-Allow-Credentials "true" env=ENV_SET
    Header set Access-Control-Allow-Methods "GET, POST, PATCH, PUT, OPTIONS" env=ENV_SET
    Header set Access-Control-Allow-Headers "Origin, Content-Type, X-Auth-Token" env=ENV_SET

РЕДАКТИРОВАТЬ 2: Оказывается, ему не нравится часть% {ENV: proto}, поэтому я изменил ее на http и добавил еще одну строку для https. Поддомен работает нормально, и заголовки настраиваются, за исключением того, что я получаю «Флаг учетных данных -« истина », но заголовок« Access-Control-Allow-Credentials »имеет значение« true, true ». в консоли. Он устанавливается только один раз (я также пробовал «объединить», и я использую set для Allow-Origin; я не могу понять, где еще это будет установлено.

Header set Access-Control-Allow-Methods: GET, POST, PATCH, PUT, OPTIONS env=ENV_SET

Если стоимость содержит пробелы, то его следует заключить в двойные кавычки. Наверное, безопаснее всегда заключите значение в кавычки. Вам также следует опустить : в конце названия заголовка. Так, например:

Header set Access-Control-Allow-Methods "GET, POST, PATCH, PUT, OPTIONS" env=ENV_SET
SetEnvIfNoCase Origin %{ENV:proto}://mautic.mysite.com ENV_SET=0

ОБНОВИТЬ: Третий аргумент SetEnvIf[NoCase] это регулярное выражение, поэтому переменные сервера (т.е. %{ENV:proto} не расширяются - они буквально совпадут. Если вам нужно сопоставить http или https затем встроите это в одно регулярное выражение, например. https? (The ? делает предыдущий символ необязательным). (Однако ваш сайт должен быть либо одним, либо другим, а не обоими?)

Чтобы сброшен/ удалить переменную среды, вы должны поставить перед ней префикс ! (восклицательный знак) вместо того, чтобы установить 0 (это все еще установлено). Например:

SetEnvIfNoCase Origin https?://mautic.mysite.com !ENV_SET

Если я удалю строки SetEnvIf, они все равно будут установлены.

Вероятно, из-за того, что не процитировал заголовок стоимость. Но это также может быть проблема кеширования - поэтому убедитесь, что все кеши очищены.

... его следует разместить в конфигурации вместо .htaccess

Под "конфигурацией" они, вероятно, имеют в виду конфигурация сервера. Это было бы предпочтительнее (и отключите использование .htaccess файлы). Однако причина проблемы не в этом.