在 HTTPS 页面中运行 HTTP AJAX 操作时“混合内容被阻止”

IT技术 javascript php jquery html ajax
2021-01-19 05:52:08

我有一个表单,我正在向 crm (ViciDial) 提交(通过 GET,因为它需要这种方式)。我可以成功提交表单,但是如果我这样做,crm 处的处理文件只会回显成功文本,仅此而已。

我想在我的网站上显示一个感谢页面而不是那个文本,所以我决定使用 AJAX 提交表单并将其重定向到我需要的页面,但是我在浏览器上收到此错误:

混合内容:“ https://page.com页面已通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点“ http://XX.XXX.XX.XXX/vicidial/non_agent_api.php?queries=query=data '。此请求已被阻止;内容必须通过 HTTPS 提供。

这是我的 AJAX 脚本:

    <script>
    SubmitFormClickToCall = function(){

        jQuery.ajax({
            url: "http://XX.XXX.XX.XX/vicidial/non_agent_api.php",
            data : jQuery("#form-click-to-call").serialize(),
            type : "GET",
            processData: false,
            contentType: false,
            success: function(data){
                window.location.href = "https://www.example.com/thank-you";
            }
        });
    }
    </script>

仅在 URL 中设置 https 不起作用,有什么方法可以通过 GET 提交数据并将用户重定向到我的感谢页面?

============================

这里的问题是混合内容,这意味着我通过 HTTPS 加载了一个页面,并试图通过 AJAX 访问 HTTP 中的 API。但是浏览器不允许我们这样做。

因此,如果您不能将 API 设置为 HTTPS(这是我的情况),我们仍然可以以不同的方式处理此问题。

主要问题不是混合内容问题,而是我想将数据提交到 API 并将用户重定向到一个漂亮的感谢页面。我没有使用 AJAX,而是制作了一个接收数据的 php 文件,使用 curl 将其发送到 API(因为这是在服务器端完成的,没有混合内容问题)并将我的快乐用户重定向到一个漂亮的感谢页面。

6个回答

我通过向 HTML 页面添加以下代码解决了这个问题,因为我们使用的是不受我们控制的第三方 API。

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 

希望这会有所帮助,并为记录。

这对我有用,但不幸的是这不适用于 Internet Explorer:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/...
2021-03-22 05:52:08
我们确认此解决方案适用于我们的案例,也许将来也会对您有所帮助:我们尝试建立分段的 HTTP 实时流媒体/视频点播功能,例如www.example.com/blabla/master.m3u8. 这一切都在 http 上运行良好。但是当我们将它迁移到 https 时,它就不起作用了。我们发现初始master.m3u8可以做https请求,但是下面的分段视频块一直在使用http(因为我们使用的是第三方module)。无论我们如何调整它都不会使用https. 使用此政策并立即像魅力一样工作!
2021-03-29 05:52:08
我试过这个,但现在我在 Firefox 上遇到 CORS 错误,在 chrome 上遇到 net::ERR_SSL_PROTOCOL_ERROR。我知道所有调用都有效,因为我的网页以前是 http,但现在我更改为 https,这些调用不起作用。还有什么我可以添加到我的主 html 文件中的吗?因为如果我按照@Juanma Menendez 的步骤进行所有调用,但我不能指望每个用户都这样做。
2021-04-02 05:52:08
这会将所有http请求升级为 use https,因此您无需更改每个调用的协议。
2021-04-08 05:52:08
我已经在这个问题上挣扎了几个小时,直到我找到了你的答案,非常感谢!
2021-04-13 05:52:08

如果您使用 HTTPS 在浏览器中加载页面,浏览器将拒绝通过 HTTP 加载任何资源。正如您所尝试的,更改 API URL 以使用 HTTPS 而不是 HTTP 通常可以解决此问题但是,您的 API 不得允许 HTTPS 连接。因此,您必须在主页面上强制使用 HTTP 或请求它们允许 HTTPS 连接。

请注意:如果您转到 API URL 而不是尝试使用 AJAX 加载它,该请求仍然有效。这是因为浏览器不是从受保护的页面中加载资源,而是在加载不安全的页面并接受它。但是,为了通过 AJAX 使用它,协议应该匹配。

@StormRage 绝对!您正在运行什么类型的服务器?apache?它是共享主机还是私人服务器?
2021-03-25 05:52:08
好的,api 在我的服务器中,我可以遵循任何指南来使其成为 https 吗?
2021-03-27 05:52:08
抱歉迟到了,我设法在不使用 AJAX 的情况下解决了它,我的解决方案包括一些 wordpress 函数/php curl,我会尽快发布我的解决方案,我应该编辑我的问题并在其中编写我的解决方案,或者我应该使用写着“回答你自己的问题”的按钮吗?
2021-03-29 05:52:08
在此处突出显示答案的相关部分。唯一可行的解​​决方案是使用 HTTPS
2021-04-02 05:52:08
@StormRage 如果您需要任何进一步的帮助,请告诉我。否则,投票将激励您在 SO 上获得的公共援助。
2021-04-03 05:52:08

如果您只是在访问您信任的网页并且想要快速前进,只需:

1- 单击地址栏最右侧的盾牌图标。

允许在 Google Chrome 中混合内容

2- 在弹出窗口中,单击“仍然加载”或“加载不安全的脚本”(取决于您的 Chrome 版本)。


如果要将 Chrome 浏览器设置为始终(在所有网页中)允许混合内容:

1- 在打开的 Chrome 浏览器中,按键盘上的 Ctrl+Shift+Q 强制关闭 Chrome。在下一步之前必须完全关闭 Chrome。

2- 右键单击​​ Google Chrome 桌面图标(或开始菜单链接)。选择属性。

3- 在目标字段中现有信息的末尾,添加:“--allow-running-insecure-content”(第一个破折号前有一个空格。)

4- 单击确定。

5- 打开 Chrome 并尝试启动之前被阻止的内容。它现在应该可以工作了。

这对于为那些不想更改其设置以使网站在其浏览器(例如 OP)上运行的用户设计网站的人没有任何作用。
2021-03-15 05:52:08
谢了,兄弟。工作得很好。对开发过程非常有帮助。
2021-03-23 05:52:08

这个错误的原因很简单。您的 AJAX 试图通过 HTTP 调用,而您的服务器通过 HTTPS 运行,因此您的服务器拒绝调用您的 AJAX。这可以通过在主 HTML 文件的 head 标记中添加以下行来解决:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 
就我而言。服务器只有 HTTP 请求。我试试这个 <meta> 不能工作。浏览器说 URL 请求错误。
2021-03-20 05:52:08
@NikolayBaranenko 有什么更新吗?如何解决这个问题。我现在也处于同样的情况,现在无法负担 API 端点的另一个 ssl
2021-04-02 05:52:08
它允许,但请求是 https
2021-04-07 05:52:08
在我的故事中,我有 HTTPS 主机并向 HTTP API 发送请求,浏览器返回错误“混合内容:页面位于”,怎么办?
2021-04-07 05:52:08

我在 Vue-CLI 应用程序中遇到了与 Axios 请求相同的问题。在 Chrome 的网络选项卡中进一步检查时,我发现 axios 的请求 URL 正确,https但响应 'location' 标头为http.

这是由以下原因引起的nginx,我通过将这两行添加到 nginx 的服务器配置来修复它:

server {
    ...
    add_header Strict-Transport-Security "max-age=31536000" always;
    add_header Content-Security-Policy upgrade-insecure-requests;
    ...
}

可能无关紧要,但我的 Vue-CLI 应用程序是在 nginx 的子路径下提供的,配置如下:

location ^~ /admin {
        alias   /home/user/apps/app_admin/dist;
        index  index.html;
        try_files $uri $uri/ /index.html;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
}