njwza88 2024-07-05 14:01 采纳率: 0%
浏览 5

浏览器报mixed-content

前端 SSL 与后端 Socket 服务连接问题

前端配置了 SSL,期望能够安全地连接到后端的 socket 服务。然而,后端尚未配置 SSL,导致浏览器报告混合内容(mixed-content)错误。尽管在本地计算机上使用命令行工具 curl 能够正常访问 118.25.187.49:8005 并接收到 "Hello World" 响应,但浏览器访问时却遇到异常。
我的想法是能否后端配置SSL(听说好像socket不行)

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Stream Client</title>
</head>
<body>
  <h1>Stream Client</h1>
  <button onclick="fetchStream()">Fetch Stream</button>
  <pre id="streamOutput">Stream Output will appear here...</pre>

  <script>
    function fetchStream() {
      const streamUrl = 'http://118.25.187.49:8005'; // 替换为实际的服务器地址

      fetch(streamUrl)
        .then(response => {
          if (!response.ok) {
            throw new Error('Network response was not ok ' + response.statusText);
          }
          return response.text(); // 读取响应体作为文本
        })
        .then(data => {
          const output = document.getElementById('streamOutput');
          output.textContent = data; // 显示数据
        })
        .catch(error => {
          console.error('Error with the stream:', error);
        });
    }
  </script>
</body>
</html>

后端代码:

<?php
// 设置服务器的IP地址和端口
$server_address = '0.0.0.0:8005';

// 创建 socket 服务
$server = stream_socket_server("tcp://$server_address", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
if (!$server) {
    die("Failed to create server: $errstr");
}

echo "Server running on {$server_address}\n";

// 持续等待客户端请求
while (true) {
    // 检查是否有客户端连接
    $read = [$server];
    $write = null;
    $except = null;
    if (stream_select($read, $write, $except, 0)) {
        foreach ($read as $stream) {
            if ($stream === $server) {
                // 接受新的客户端连接
                if ($client = stream_socket_accept($server)) {
                    echo "New client connected\n";
                    // 准备 HTTP 响应
                    $response = createHttpResponse();
                    // 发送 HTTP 响应
                    fwrite($client, $response);
                    echo "HTTP response sent\n";

                    // 关闭客户端连接
                    fclose($client);
                    echo "Client disconnected\n";
                }
            } else {
                // 处理客户端数据(这里简化处理,直接关闭连接)
                fclose($stream);
            }
        }
    }
}

// 释放资源
fclose($server);

// 函数:创建 HTTP 响应
function createHttpResponse() {
    // HTTP 响应状态行
    $statusLine = "HTTP/1.1 200 OK\r\n";
    // HTTP 响应头
    $headers = "Content-Type: text/html; charset=UTF-8\r\n";
    $headers .= "Connection: close\r\n";
    $headers .= "Server: MyCustomServer/1.0\r\n";
    $headers .= "Date: " . gmdate('D, d M Y H:i:s') . " GMT\r\n";
    // 空行,分隔头和体
    $divider = "\r\n";
    // HTTP 响应体
    $body = "<!DOCTYPE html><html><head><title>HTTP Response</title></head><body><h1>Hello, World!</h1><p>This is a complete HTTP response from a PHP server.</p></body></html>";

    // 组合完整的 HTTP 响应
    return $statusLine . $headers . $divider . $body;
}
?>
  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-05 14:01
    关注

    引自免费微信小程序:皆我百晓生

    首先,你的后端代码创建了一个简单的 HTTP 服务器,它通过 TCP 连接接收请求并发送 HTTP 响应。然而,由于你的后端服务器未配置 SSL,当你在前端尝试通过 HTTPS 连接它时,浏览器会报告混合内容(mixed-content)错误。混合内容指的是在一个 HTTPS 页面中包含 HTTP 资源的情况,浏览器出于安全原因会阻止这种情况。

    为了解决这个问题,你有几个选项:

    选项 1:为后端服务器配置 SSL

    这是最推荐的方法。你可以为后端服务器配置 SSL 证书,这样前端可以通过 HTTPS 安全地连接到它。配置 SSL 的过程可能涉及购买证书、配置服务器等步骤,具体取决于你的服务器类型和操作系统。一旦配置了 SSL,前端代码中的 URL 就应该使用 HTTPS 协议。

    选项 2:在前端允许不安全的混合内容

    如果你只是在本地测试并且知道风险,你可以选择在前端暂时允许混合内容。但请注意,这种方法会降低浏览器的安全性。你可以通过添加 meta 标签来实现这一点:

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

    这将允许浏览器升级不安全的请求到 HTTPS。但是,这不会解决根本问题,只是暂时绕过错误。一旦部署到生产环境,你应该始终使用 HTTPS。

    选项 3:使用 WebSocket 或其他加密协议

    如果你的应用需要实时通信,可以考虑使用 WebSocket 协议或其他加密协议来连接前端和后端。这样,你可以在前端使用安全的连接进行通信,而不需要依赖 HTTP 的不安全性。你需要确保前端和后端都支持 WebSocket 并且正确配置。

    关于你的代码问题,前端代码本身是正确的,只是由于后端未配置 SSL 而导致连接问题。一旦后端配置了 SSL,你应该能够正常地获取数据。后端代码也是正确的,只是需要配置 SSL 来解决安全性问题。如果你决定暂时允许混合内容,只需添加上述 meta 标签即可。但是请记住,这只是临时的解决方案。长远来看,配置 SSL 是最好的选择。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 求ax+by=n的正整数解
  • ¥50 使用MS Log Parser查询使用Bitvise SSH Server登录的IP
  • ¥20 校园二手交易小程序搭建
  • ¥15 请问在ubuntu用conda创建环境报错怎么能解决
  • ¥15 STM32CubeMX/proteus按键控制指示灯颜色切换
  • ¥20 python,计算区位熵和扩张指数
  • ¥15 Python环境配置
  • ¥15 大四学生的困惑,有偿提问!
  • ¥15 解决页面无法编入索引:被“noindex”标签排除的问题?
  • ¥15 arduino测量电阻