混合内容的jQuery ajax HTTPS请求在Laravel上被阻止了

6
我想这个问题对于某些人来说很容易,但对我来说却是一个令人头疼的情况。
我有一个Laravel 5.3网站,各种页面都有ajax请求。因为我使用了csrf_field()功能,它们可以正常工作。
但是有一个页面,ajax会产生以下错误:
Mixed Content: The page at 'https://example.com/fb/reports' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://example.com/fb/json?levelType=&id=&aggLevel=ad&start=&end='. This request has been blocked; the content must be served over HTTPS.

我的 JavaScript 代码看起来像这样:

    var relUrl = '/fb/json/';
    var payload = {
        levelType: levelType,
        id: id,
        aggLevel: aggLevel,
        start: start,
        end: end
    };
    console.log(relUrl);
    return $.ajax({
        type: 'GET',
        dataType: 'json',
        data: payload,
        url: relUrl,
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }            
    });

我已经阅读了大量关于这个错误的文章。我尝试了很多建议的解决方法,包括将相对URL更改为完整的https URL,或者以2个斜杠开头。

我甚至尝试更改我的Laravel路由工作方式,现在只使用查询字符串参数。

我研究了下面所有的文章(还有更多)。

另外,由于此ajax查询位于站点的密码保护部分(而那些有效的ajax查询位于站点的公共/开放部分),所以我认为这可能与问题有关。但是,我使用SSH登录到生产服务器,并使用vim暂时删除了需要任何身份验证的行,https错误仍然发生。

从这里开始,我可以采取哪些步骤进行进一步调试?我可以在Cloudways服务器上“tail”哪些日志?

Cloudflare是否可能会干扰任何内容(我怀疑,因为其他ajax查询都在https上工作)?

谢谢!

2个回答

18

概要: 由于我的 Laravel web.php 路由文件需要这样做,我需要将 var relUrl = '/fb/json/'; 替换为 var relUrl = '/fb/json';(删除尾部斜杠)。


在 Chrome 控制台中,我注意到 https XHR 请求被“取消”,并被替换为一个 http 请求。

然后我使用 ssh 登录到远程生产服务器,并使用 vim 暂时禁用身份验证要求。

然后在 Chrome 控制台中,我定义并运行了一个新的 ajax 命令,使用带有查询字符串参数的绝对 https URL 结尾。那个可行的(没有混合内容错误)。然后我尝试了一个像这样的相对 URL,它也起作用了。

即使是没有有效载荷、查询字符串参数或尾随斜杠的相对 URL 也可以工作。

然后我再次添加了尾随斜杠,但它不起作用了。

我仍然希望有一种更简单的方法来跟踪或调试重定向路径或任何其他发生的事情。 我仍然觉得自己笨拙地跌跌撞撞地发现答案(经过多个小时),而不是知道如何可靠地解决这个问题。


你解决过这个问题吗?我现在正在处理它。 - dgo
1
是的。看我的第一行。删除尾随的斜杠就解决了。这就是为什么这是被接受的答案。祝好运。 - Ryan
谢谢。我们最终解决了这个问题。问题在于移除尾随斜杠,但是Apache也会添加斜杠,所以在我们的情况下,它更加疯狂一些。 - dgo
对我来说,我必须在Cloudflare中启用完整的SSL而不是灵活的。 - Harry Bosh

0

在从HTTP切换到HTTPS时,可能会出现混合内容问题 - 内容必须作为HTTPS提供。

因此,首先要修改.env文件中的APP_URL,如果我们使用资产助手,则不应该在URL方面出现任何问题。

APP_URL=https://url.net

最后,在**api.php****web.php**的开头添加以下内容:

if (App::environment('production')) {
    URL::forceScheme('https');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接