具有相同域和端口的共享托管触发CORS

时间:2019-04-27 19:33:26

标签: laravel apache cors shared-hosting preflight

在过去的几天里,A一直在努力地使用CORS,特别是在非CORS设置中的飞行前请求。 我正在从SPA应用通过axios(domain.com:80)向REST API(domain.com:80/api)发送请求,并且该请求被归类为CORS请求。在本地,使用相同的设置,请求就可以了,不会触发预检请求。

在我的研究中,相同的原产地请求必须具有:

  • 相同域
  • 相同的子域
  • 相同的港口
  • 相同的协议

我认为我的生产环境会检查上述所有内容,但有相反的说法。

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

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

我已经尝试过:

  • 在本地克隆环境(工作正常-不发送飞行前请求)
  • 启用/禁用访问控制允许标题
  • 说实话,我什至不知道下一步该怎么做:|

解决此问题将使我的应用程序速度提高100%,所以对我来说这很重要。但这根本没有道理。也许我缺少明显的东西。

也许是我的共享托管提供程序正在做的一些与代理相关的事情。但是,甚至比我都不知道如何检查。

Preflight请求示例(通过“开发工具”中的“网络”标签):

  

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

     

响应标题
  访问控制允许标题:授权
  访问控制允许方法:GET
  访问控制允许来源:http:/ domain
  访问控制最大年龄:25200
  缓存控制:无缓存,私有
  连接:关闭
  内容长度:0
  内容类型:text / html; charset = UTF-8
  日期:2019年4月27日,星期六,格林尼治标准时间
  伺服器: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
  Access-Control-Expose-Header:*
  年龄:0
  缓存控制:无缓存,私有
  连接:保持活动状态
  内容类型:application / json
  日期:2019年4月27日,星期六18:28:41 GMT
  伺服器:Apache
  传输编码:分块
  变化:来源,授权
  通过:1.1 varnish-v4
  X-RateLimit-Limit: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,例如Gecko)Chrome / 73.0.3683.103 Safari / 537.36

domain / .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>

domain / 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>

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

1 个答案:

答案 0 :(得分:0)

也许我缺少明显的东西。

是的。

在SPA中,我确实在获取 int CheckingDublicate = 0, count = 1; for(int i = 1; i <= randArray.length; i++){ if(count<=10{ if(CheckingDublicate!=randArray[randArray.length-i]) { //Ignoring if dublicate System.out.print(randArray[randArray.length-i]+" "); CheckingDublicate = randArray[randArray.length-i]; count++; } } else break; } 是严格的domain/api。使原始URL与请求URL匹配,如@sideshowbarker

所述
  

就检查URL而言,“域”部分必须完全相同。因此,例如“ api.domain.com”和“ www.domain.com”是两个不同的来源。您从“网络”标签中复制的标头显示“来源:http:/域”和“ http:/域/公司名称/ api / perfil / 3”。因此,我要告诉您的是,实际的“ http:/ domain / company-name / api / perfil / 3” URL的实际来源与“ Origin:http:/ domain”的实际来源并不完全匹配。 “域”部分不完全相同,或者它们都不都是“ http”或都不是“ https”,或者您遗漏了一些端口号。