我有 10 个子域,并从子域 (static.88n8.com) 获取所有静态文件。
我想允许 .htaccess 中的所有子域跨源:
SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
或者这个:
SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header set Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
或者这个:
SetEnvIf Origin "^http(s):\/\/(www\.google.com|google\.com|88n8\.com|second\.88n8\.com|third\.88n8\.com|fourth\.88n8\.com)$" OriginDomainStr=$0
Header always set Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
控制台向我显示:
Access to font at 'https://static.88n8.com/font.woff' from origin 'https://88n8.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这很奇怪。该正则表达式应该匹配,但似乎根本不匹配。
我尝试了这个来检查是否可以设置 header 并且它适用于主域:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://88n8.com"
</IfModule>
我不想使用 *
或单个域。为什么我的正则表达式在 .htaccess 中永远不匹配?看来是我的Regex test没问题。
免责声明:88n8.com 是一个示例,显示我的域名中包含数字和英文字符。这不是我真正的域名,我不拥有它。
编辑 1
正如您在我的 REGEX 中看到的,它应该应用于所有 88n8.com
子域和 google.com(使用 https
或 http
)。
我只在我的 REGEX 中包含 4 个子域来向您展示我的 REGEX。
编辑2
我已将此代码添加到我的 PHP 页面中以了解当前的来源:
echo (isset($_SERVER['HTTP_ORIGIN']))? $_SERVER['HTTP_ORIGIN'] : 'NOT SET';
结果是NOT SET
。看来我的 Origin
为空或 NULL,这就是 REGEX 永远不匹配的原因。
编辑3
我已经使用 IP2Proxy 检查了服务器 IP。这是代理检测结果:
编辑4
我尝试选择任何内容,但仍然没有机会使用这两个正则表达式:
SetEnvIf Origin "." OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
SetEnvIf Origin "^(?![\s\S])" OriginDomainStr=$0
Header add Access-Control-Allow-Origin %{OriginDomainStr}e env=OriginDomainStr
如何直接查看Origin的值?
最佳答案
您正在从 static
子域进行访问。它不在已批准子域的正则表达式中。
而且由于(s)
,它也不会匹配http。要使其可选,请将 http(s)
更改为 https?
(这使得 s
可选)。这也应该可以解决其他所有问题,因为当您使用 (s)
创建匹配组时,您的 $0 变量将是 s
而不是您想要的域。
我还建议合并子域。
^https?:\/\/((www\.)?google\.com|(第一|第二|第三|第四|静态)\.88n8\.com)$
来自 88n8.com
和 google.com
的所有子域和主域
^https?:\/\/((www\.)?google\.com|(.+\.)?88n8\.com)$
关于php - REGEX 永远不会与 .htaccess 中的 Origin 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410500/