Я пытаюсь установить заголовки, если источником является конкретный сайт, чтобы разрешить конфликт ресурсов, который у меня есть (с использованием 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
файлы). Однако причина проблемы не в этом.