【问题标题】:Shared Hosting Triggering CORS with same domain and port共享主机触发具有相同域和端口的 CORS
【发布时间】: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”,或者您省略了一些端口号。

标签: laravel apache cors shared-hosting preflight


【解决方案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”,或者您省略了某些端口号。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 2011-08-29
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2018-07-07
    • 2011-02-16
    相关资源
    最近更新 更多