共享主机触发具有相同域和端口的 CORS

Posted

技术标签:

【中文标题】共享主机触发具有相同域和端口的 CORS【英文标题】:Shared Hosting Triggering CORS with same domain and port 【发布时间】:2019-09-16 22:42:01 【问题描述】:

过去几天,A 一直在努力使用 CORS,特别是非 CORS 设置中的预检请求。 我正在通过 axios (domain.com:80) 从 SPA 应用程序发送请求 到 rest API (domain.com:80/api) 并将其归类为 CORS 请求.在本地,使用相同的设置,请求很好,不会触发预检

在我的研究中,同源请求必须有:

同域 相同的子域 同一个端口 相同的协议

我认为我的生产环境检查了上述所有内容,但情况恰恰相反。

我的环境按以下方式托管在共享主机提供商中:

SPA (Vue) - http://domain:80/company-name/ API (Laravel) - http://domain:80/company-name/api

我已经试过了:

在本地克隆环境(工作正常 - 不发送预检请求) 启用/禁用访问控制允许标头 说实话,我什至不知道下一步该尝试什么:|

解决此问题将使我的应用程序速度提高 100%,因此对我来说意义重大。但这根本没有意义。也许我遗漏了一些明显的东西。

也许是我的共享主机提供商正在做的一些与代理相关的事情。但即使如此,我也不知道如何检查。

预检请求示例(来自开发工具中的网络选项卡):

常规 请求网址:http://domain/company-name/api/perfil/3 请求方法:OPTIONS 状态码:200 OK 远程地址:185.200.153.100:80 推荐人政策:no-referrer-when-downgrade

响应标头 访问控制允许标头:授权 访问控制允许方法:GET 访问控制允许来源:http://domain 访问控制最大年龄:25200 缓存控制:无缓存,私有 连接:关闭 内容长度:0 内容类型:文本/html;字符集=UTF-8 日期:2019 年 4 月 27 日星期六 18:28:40 GMT 服务器:Apache

请求标头 显示临时标题 访问控制请求标头:授权 访问控制请求方法:GET 来源:http://domain 引用者:http://domain/company-name/perfis 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/73.0.3683.103 Safari/537.36

请求示例(在预检响应之后):

常规 请求网址:http://domain/company-name/api/perfil/3 请求方法:GET 状态码:200 OK 远程地址:185.200.153.100:80 推荐人政策:no-referrer-when-downgrade

响应标头 接受范围:字节 访问控制允许来源:http://domain 访问控制公开标头:* 年龄:0 缓存控制:无缓存,私有 连接:保持活动 内容类型:application/json 日期:2019 年 4 月 27 日星期六 18:28:41 GMT 服务器:阿帕奇 传输编码:分块 变化:来源、授权 通过:1.1 varnish-v4 X-RateLimit-限制:60 X-RateLimit-剩余:58 X-清漆:46418125

请求标头 接受:application/json、text/plain、/ 授权:不记名token 来源:http://domain 引用者:http://domain/company-name/perfis 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

域/.htaccess

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteBase /
  RewriteRule ^(api)($|/) - [L]
  RewriteRule ^index\.html$ - [L]
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_FILENAME !-d
  RewriteRule . /index.html [L]
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css|woff2)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

域/api/.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %HTTP:Authorization .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_URI (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

如果需要任何其他数据,请随时询问。

【问题讨论】:

浏览器在 devtools 控制台中记录的确切错误消息是什么?问题中显示的请求标头不表示任何错误;相反,它们表明您的服务器正在发回您已将其配置为发送的 Access-Control-Allow-* 标头。 @sideshowbarker 没有错误,它只是在这种环境中存在预检请求,这没有意义。对我来说,从 domain.com 向 domain.com/api 发送请求不应触发任何预检请求。 由于您没有在问题的错误消息中显示真实的 URL,因此这里的其他人无法为您提供任何帮助。但是,如果您的浏览器正在发出预检 OPTIONS 请求,那么实际上您的前端代码正在尝试发出跨域请求。因此,您向其发送请求的 URL 与您的前端代码的来源不同。 @sideshowbarker 这些不是错误,我只是从 chrome 开发工具中的网络选项卡复制并粘贴。很抱歉,但我无法分享真实的 url 和 ips……我如何检查两个代码库的来源?我假设远程地址必须相同吗? 就检查网址而言,“域”部分必须完全相同。因此,例如 'api.domain.com' 和 'www.domain.com' 是两个不同的来源。您从“网络”选项卡复制的标题显示“来源:http:/domain”和“http:/domain/company-name/api/perfil/3”。所以我要告诉你的是,真正的“http:/domain/company-name/api/perfil/3”URL 的来源与实际的“Origin:http:/domain”并不完全匹配。 “域”部分不完全相同,或者它们既不是“http”也不是“https”,或者您省略了一些端口号。 【参考方案1】:

也许我遗漏了一些明显的东西。

是的。

在 SPA 中,我正在获取 domain/api,而 www.domain/api 确实是正确的。使源 URL 与请求 URL 匹配,如 @sideshowbarker 所述

就检查 URL 而言,“域”部分必须完全相同。因此,例如 'api.domain.com' 和 'www.domain.com' 是两个不同的来源。您从“网络”选项卡复制的标题显示“来源:http:/domain”和“http:/domain/company-name/api/perfil/3”。所以我要告诉你的是,真正的“http:/domain/company-name/api/perfil/3”URL 的来源与实际的“Origin:http:/domain”并不完全匹配。 “域”部分不完全相同,或者它们既不是“http”也不是“https”,或者您省略了某些端口号。

【讨论】:

以上是关于共享主机触发具有相同域和端口的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

跨域和CORS

由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败

记一次网络共享打印机故障

一台分机在添加主机共享打印机端口的时候出现“拒绝访问”是怎么回事?

只有一个主机和独立ip,iis和php怎样共享80端口。

跨域资源共享CORS