htaccess 条件标头集忽略条件

htaccess 条件标头集忽略条件

如果来源是特定站点,则尝试设置标头以解决我遇到的资源冲突(使用托管在子域上的 Mautic)。

如果我为任何情况添加标题,当我尝试使用 Mautic 时我会收到 500 错误,但从我的网站访问的资源可以正常工作,因此我只想在我的网站是原点时设置它们。

这就是我所拥有的:

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 添加了另一行。子域工作正常,并且标头正在设置,只是我在控制台中收到“Credentials 标志为‘true’,但‘Access-Control-Allow-Credentials’标头为‘true, true’。”。它只被设置了一次(我也尝试了“合并”,并且我使用设置来设置 Allow-Origin;我搞不清楚还会在哪里设置它。

答案1

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}未扩展 - 它们将按字面意思匹配。如果您需要匹配httphttps然后将其构建为单个正则表达式,例如https??使前一个字符成为可选)。(但是,您的网站应该是其中之一,而不是两者?)

取消设置/删除环境变量,您应该在其前面加上!(感叹号),而不是将其设置为0(这仍然有效)。例如:

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

如果我删除 SetEnvIf 行,它们仍然被设置。

可能是因为没有引用标题价值。但这也可能是缓存问题 - 因此请确保清除所有缓存。

...它应该放在配置中而不是 .htaccess 中

他们所说的“配置”可能是指服务器配置。这将是更好的选择(并禁用文件的使用.htaccess)。但是,这不是导致此问题的原因。

相关内容