php - REGEX 永远不会与 .htaccess 中的 Origin 匹配

标签 php regex .htaccess http litespeed

我有 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(使用 httpshttp)。 我只在我的 REGEX 中包含 4 个子域来向您展示我的 REGEX。

编辑2

我已将此代码添加到我的 PHP 页面中以了解当前的来源:

echo (isset($_SERVER['HTTP_ORIGIN']))? $_SERVER['HTTP_ORIGIN'] : 'NOT SET';

结果是NOT SET。看来我的 Origin 为空或 NULL,这就是 REGEX 永远不匹配的原因。

编辑3

我已经使用 IP2Proxy 检查了服务器 IP。这是代理检测结果:

Proxy Detection Result

编辑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.comgoogle.com 的所有子域和主域

^https?:\/\/((www\.)?google\.com|(.+\.)?88n8\.com)$

关于php - REGEX 永远不会与 .htaccess 中的 Origin 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410500/

相关文章:

php - 使用 .htaccess 文件更改 URL 后不显示结果

apache - 正确的 htaccess 缓存参数

php - 字符串的正则表达式看起来像 PHP 中的 javascript 对象

php - 如何在生成 PDF 时将 Google map (或其他 GIS map )输出嵌入到 PDF 中?

php - 修复 HTML 片段

ios - XCode搜索:如何创建Matches Regex(正则表达式)以选择正确的文件

regex - 如果 URI 包含单词,则在 Apache .htaccess 中设置 header

php - 连接失败 : 0 push notification

javascript 正则表达式 短信字符数

regex - 如何在 Emacs 正则表达式中表示 "not a bracket"?