Я пытаюсь установить заголовки, если источником является конкретный сайт, чтобы разрешить конфликт ресурсов, который у меня есть (с использованием 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, но я не уверен, что это значит.
Есть предложения по поводу того, как я могу это исправить или как-то иначе заставить это работать?
Спасибо
EDIT: синтаксис обновлен с советом от 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
EDIT 2: Оказывается, нет ' Мне нравится часть% {ENV: proto}, поэтому я изменил ее на http и добавил еще одну строку для https. Поддомен работает нормально, и заголовки настраиваются, за исключением того, что я получаю «Флаг учетных данных -« true », но заголовок« Access-Control-Allow-Credentials »имеет значение« true, true ». в консоли. Он устанавливается только один раз (я также пробовал «объединить», и я использую set для Allow-Origin; я не могу понять, где еще это будет установлено.
Набор заголовков Access-Control-Alloww-Methods: ДОСТАТЬ, ПОСТ, ЗАПЛАТИТЬ, ПОЛОЖИТЬ, ВАРИАНТЫ 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
UPDATE: Третий аргумент к SetEnvIf[NoCase]
- регекс, поэтому переменные сервера server (т.е. %{ENV:proto}
не расширяются - они будут сопоставлены буквально. Если вам нужно сопоставить либо http
, либо https
, то поместите это в один регекс, например https?
(The ?
делает предыдущий символ необязательным). (Однако, ваш сайт должен быть либо одним, либо другим, а не обоими?)
To unset/удалить переменную окружения, вы должны префиксовать ее с помощью !
(восклицательный знак) вместо того, чтобы устанавливать ее на 0
(это все еще установлено). Например:
SetEnvIfNoCase Origin https?://mautic.mysite.com !ENV_SET
Если я удалю строки SetEnvIf, они все равно будут установлены.
Наверное, из-за того, что не удалось процитировать значение заголовка . Но это также может быть проблемой кэширования - поэтому убедитесь, что все кэши очищены.
...это должно быть помещено в конфигурацию вместо .htaccess
By "configuration" они, вероятно, ссылаются на конфигурацию server. Это было бы предпочтительнее (и отключить использование файлов .htaccess
). Однако, это не является причиной данной проблемы.