Nginx反向代理HTTPS服务报错排查:The plain HTTP request was sent to HTTPS port
1. 问题现场一个看似简单却令人困惑的报错最近在给一个内部服务配置Nginx反向代理让它通过HTTPS对外提供服务时遇到了一个经典的报错The plain HTTP request was sent to HTTPS port。这个错误信息直译过来就是“一个明文的HTTP请求被发送到了HTTPS端口”。乍一看这似乎是个低级错误——客户端用HTTP协议去访问一个配置了SSL的HTTPS端口通常是443。但实际情况往往更微妙尤其是在反向代理的场景下你明明在浏览器里输入的是https://yourdomain.comNginx日志里却固执地报出这个错让人一时摸不着头脑。这个问题的核心其实不在于客户端直接发错了协议而在于请求在到达你配置的Nginxserver块之前其协议特征可能就已经“丢失”或“错位”了。对于运维和开发来说这不仅仅是一个配置错误更是一个理解Nginx请求处理流程、SSL终止位置以及代理行为的好机会。如果你也正在被这个报错困扰或者想深入理解Nginx在代理HTTPS上游服务时的内部机制那么接下来的内容会带你一步步拆解问题从现象到根因再到多种场景下的解决方案。2. 深入理解报错Nginx的“协议感知”与端口监听要解决问题首先得明白Nginx为什么会发出这样的抱怨。这需要我们从Nginx监听端口和处理请求的基本逻辑说起。2.1 SSL/TLS握手与协议识别当一个客户端比如浏览器尝试与服务器建立HTTPS连接时会发生一个叫做TLS握手的过程。在这个握手的最初阶段客户端会发送一个ClientHello消息这个消息本身是明文的但它包含了一个关键信息它打算使用TLS协议。服务器在收到这个ClientHello后才会开始进行密钥交换等后续加密步骤。Nginx的listen指令在配置了ssl参数后例如listen 443 ssl;它就会在指定的端口这里是443上期待这种TLS握手的发生。它会在TCP连接建立后立即尝试读取并解析ClientHello。如果它收到的第一个数据包不符合TLS握手的格式Nginx就会认为这是一个普通的、未加密的HTTP请求于是抛出了The plain HTTP request was sent to HTTPS port这个错误。2.2 反向代理场景下的复杂性在简单的静态网站服务中这个错误通常意味着客户端真的用http://访问了https://的地址。但在反向代理场景下情况就复杂了。你的Nginx可能同时监听80和443端口负责将请求转发给后端的应用服务器比如运行在8080端口的Tomcat或者另一个HTTP服务。这里的关键在于代理链。你的Nginx作为边缘服务器终止了来自客户端的HTTPS连接即解密了数据。然后它需要创建一个新的请求发送给后端服务器。这个新请求使用什么协议完全由Nginx的proxy_pass指令所在location块的配置决定与客户端最初的协议无关。最常见的错误配置模式是这样的server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { # 错误配置直接使用http://指向后端 proxy_pass http://backend_server:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 这个头很重要 } }这个配置看起来没问题Nginx确实在443端口终止了SSL。但是如果后端服务器backend_server:8080自己也配置了SSL期待一个HTTPS请求那么问题就来了。Nginx使用http://协议发过去一个明文HTTP请求后端服务器如果在8080端口也期待TLS握手就会拒绝这个请求。然而这个拒绝信息在传递回Nginx时可能被转换或丢失最终在Nginx的错误日志中呈现为开头的那个报错因为它发生在Nginx自己的443端口监听逻辑里。另一种情况是你可能在同一个server块里混合了带ssl和不带ssl的listen指令或者配置了错误的default_server导致流量被错误的服务器块处理。3. 核心排查链路从日志到配置的逐层验证当遇到这个报错时不要急于修改配置先按照一个清晰的排查链路来定位问题。盲目修改往往会让问题更复杂。3.1 第一步检查Nginx错误日志与访问日志日志是定位问题的第一现场。你需要同时查看错误日志error_log和访问日志access_log并且确保日志级别足够详细例如error_log /var/log/nginx/error.log debug;在排查时临时开启debug级别事后记得改回。在错误日志中找到报错The plain HTTP request was sent to HTTPS port的那一行。注意看它前面的连接标识如client: 192.168.1.100和时间戳。在访问日志中根据时间戳和客户端IP找到对应的访问记录。重点看几个字段$request 记录的是完整的请求行例如GET /api/data HTTP/1.1。这里显示的是Nginx最终处理请求时认定的协议。如果这里显示HTTP/1.1而不是HTTPS那说明在Nginx看来这个请求就是HTTP。$scheme 这个变量代表请求使用的协议http或https。在proxy_set_header中我们常用$scheme来告诉后端请求最初的协议。但在访问日志里它反映的是Nginx处理时的协议判断。$ssl_protocol 如果这个字段是空的那就证实了Nginx没有在这个连接上检测到SSL握手。注意临时修改日志级别和格式可以获取更多信息。你可以在http块或server块中自定义一个日志格式包含更多变量例如log_format debug_log $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $scheme $ssl_protocol $server_port; access_log /var/log/nginx/debug_access.log debug_log;3.2 第二步验证Nginx配置语法与加载在修改任何配置之前先用nginx -t命令测试配置文件的语法是否正确。这个命令会检查语法并告诉你配置文件路径。确保你修改的是Nginx真正加载的那个配置文件。有时候问题可能出在配置片段include的文件或者多个配置文件冲突上。使用nginx -T可以打印出Nginx实际加载的所有配置方便你全局搜索listen、ssl和proxy_pass指令。3.3 第三步分析完整的请求路径根据日志画出请求的完整路径客户端 - (HTTPS) - Nginx 443端口。Nginx 解密 - 根据server_name和location匹配决定转发。Nginx - (???) - 后端服务器。你需要明确第3步中Nginx到底用了什么协议、什么端口去连接后端。使用proxy_pass http://backend:port就是HTTP使用proxy_pass https://backend:port就是HTTPS。这里的一个微小差别就是问题的根源。3.4 第四步检查后端服务状态与期望如果怀疑是后端服务的问题直接绕过Nginx测试后端。如果后端服务监听8080你可以用curl命令测试# 测试后端是否响应HTTP curl -v http://backend_server_ip:8080/health # 如果后端期待HTTPS尝试假设后端有自签名证书 curl -vk https://backend_server_ip:8443/health通过curl的详细输出(-v)你可以看到完整的HTTP请求和响应头以及SSL握手情况。如果后端只接受HTTPS而你用HTTP去访问后端通常会返回一个400 Bad Request或者直接关闭连接。4. 解决方案大全针对不同场景的修复策略找到了问题根源解决方案就清晰了。以下是针对不同场景的配置修正方法。4.1 场景一Nginx代理HTTP后端但客户端误访问这是最单纯的情况。你的Nginx配置了SSL代理到一个HTTP后端但用户或者某个爬虫直接用http://访问了你的443端口。解决方案在监听443端口的server块中配置一个重定向将所有HTTP请求重定向到HTTPS。但注意对于已经到达443端口的明文HTTP请求Nginx会先报错然后才能处理重定向指令。因此更常见的做法是在监听80端口的server块中做重定向。# 监听80端口的server块处理所有HTTP请求 server { listen 80; server_name example.com www.example.com; # 永久重定向到HTTPS return 301 https://$server_name$request_uri; } # 监听443端口的server块处理所有HTTPS请求 server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://backend_server:8080; # 代理到HTTP后端 ... # 其他proxy_set_header配置 } }4.2 场景二Nginx需要代理到HTTPS后端上游服务自带SSL这是导致开头报错的最常见、也最隐蔽的场景。你的后端服务例如一个Java应用使用Spring Boot内置的HTTPS或者另一个Nginx自己就提供了HTTPS端点。错误配置proxy_pass http://secure-backend:8443;正确配置proxy_pass https://secure-backend:8443;仅仅是把http://改成https://吗还不够。当你使用proxy_pass https://...时Nginx需要与后端建立一个新的HTTPS连接这意味着它需要验证后端服务器的证书。location / { proxy_pass https://secure-backend:8443; # 关键的头信息传递 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 告诉后端最初的协议是https # HTTPS代理特有的配置 proxy_ssl_verify on; # 验证后端证书生产环境建议开启 proxy_ssl_verify_depth 2; proxy_ssl_trusted_certificate /path/to/trusted_ca_certs.pem; # 信任的CA证书 proxy_ssl_certificate /path/to/client_cert.pem; # 如果后端需要客户端证书 proxy_ssl_certificate_key /path/to/client_cert.key; proxy_ssl_name $proxy_host; # 用于SNI通常设为$proxy_host proxy_ssl_server_name on; # 启用SNI proxy_ssl_protocols TLSv1.2 TLSv1.3; # 指定协议版本 proxy_ssl_ciphers HIGH:!aNULL:!MD5; # 指定加密套件 }实操心得在内网环境中后端可能使用自签名证书。这时你需要将后端证书的CA或证书本身添加到proxy_ssl_trusted_certificate并将proxy_ssl_verify设置为off仅限测试环境。否则Nginx会因证书验证失败而无法连接到后端错误日志中会出现SSL_do_handshake() failed等相关错误这可能与最初的报错不同但根本原因相关。4.3 场景三混合监听与默认服务器冲突如果你的Nginx配置了多个server块并且使用了default_server参数或者80和443端口的配置不匹配可能导致流量被错误的server块处理。# 错误示例模糊的默认服务器 server { listen 80 default_server; listen 443 ssl default_server; # 443也设置了default_server server_name _; # 这个块可能会捕获所有未知域名的443请求如果没配ssl就会报错 return 444; # 或者一些其他处理 } server { listen 443 ssl; server_name example.com; # 正确的配置 }解决方案明确每个server块的server_name谨慎使用default_server。确保监听443端口的server块都正确配置了ssl参数和证书。对于不需要处理HTTPS的default_server只监听80端口。4.4 场景四使用stream模块进行TCP/UDP代理如果你使用Nginx的stream模块进行四层代理例如代理数据库端口或某些非HTTP协议那么stream块内的配置不涉及HTTP/HTTPS协议也就不会出现这个错误。这个错误是http模块特有的。确保你没有错误地将HTTP代理的配置proxy_pass http://...放在了本应使用四层代理的地方。5. 进阶排查与相关陷阱即使按照上述方案修改了问题可能依然存在或者以其他形式出现。这里有几个更深层次的排查点和常见陷阱。5.1 检查防火墙与负载均衡器在企业网络中Nginx前面可能还有一层负载均衡器如F5, AWS ALB/NLB或防火墙。这些设备可能会进行SSL卸载Termination然后将解密后的HTTP流量转发给后端的Nginx。如果它们配置错误比如将HTTPS流量解密后却仍然用TCP模式转发到Nginx的443端口那么Nginx在443端口收到的就是明文HTTP流量从而触发报错。如何排查查看Nginx访问日志中的$remote_addr。如果这个IP不是你客户端的公网IP而是某个内网IP如10.x.x.x, 172.x.x.x那么流量很可能经过了中间设备。你需要联系网络团队确认负载均衡器的监听器Listener配置是否正确确保它要么将HTTPS流量透传TCP Passthrough到Nginx要么在SSL卸载后将流量转发到Nginx的80端口或其他非SSL端口。5.2 HTTP/2与协议升级现代浏览器和Nginx都支持HTTP/2 over HTTPS (h2)。虽然这通常不会直接导致该错误但在一些边缘情况下如果客户端尝试在明文HTTP连接上发起HTTP/2连接或者配置混乱也可能引发问题。确保你的SSL配置支持现代协议并且没有错误地配置了http2指令在非SSL的listen上。5.3 代理头信息传递的重要性头信息X-Forwarded-Proto对于后端应用至关重要。许多Web框架如Spring Boot, Django, Express依赖这个头来判断原始请求是否通过HTTPS访问从而正确地生成重定向URL或设置安全cookie。如果这个头传递错误比如传成了http即使前端是HTTPS后端也可能错误地生成一个HTTP的URL导致客户端又去发起HTTP请求形成循环或错误。在你的location块中确保设置了proxy_set_header X-Forwarded-Proto $scheme;并且在后端应用中配置为信任这个头例如Spring Boot的server.forward-headers-strategynative或使用X-Forwarded-Proto过滤器。5.4 Docker与容器网络中的特殊问题在Docker环境中运行Nginx时网络拓扑变得更加复杂。一个常见的错误是在Docker Compose中Nginx容器通过服务名如app:8080代理到应用容器但应用容器内部只暴露了HTTP端口。然而如果你在Nginx配置中错误地将服务名映射到了一个外部定义的、带HTTPS的域名上就会出问题。确保你的Docker网络内通信使用正确的协议和端口。通常容器间通信使用HTTP即可SSL在边缘的Nginx容器终止。检查Nginx容器中proxy_pass指令指向的地址和端口是否确实是后端应用容器暴露的端口。6. 一个完整的配置示例与调试流程让我们通过一个完整的例子串联起配置、测试和调试的全过程。目标将域名api.example.com的HTTPS流量通过Nginx反向代理到内网一个运行在https://192.168.1.10:9443上的Spring Boot应用自带SSL使用自签名证书。步骤1准备证书将Spring Boot应用的自签名证书或其CA证书拷贝到Nginx服务器上例如/etc/nginx/ssl/backend-ca.crt。步骤2编写Nginx配置# /etc/nginx/conf.d/api-proxy.conf upstream backend_https { # 如果后端是集群可以在这里定义多个server server 192.168.1.10:9443; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name api.example.com; # 边缘Nginx自己的SSL证书由公共CA签发 ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; # 强化SSL配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; location / { # 关键使用https://协议连接后端 proxy_pass https://backend_https; # 传递必要的头信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议为https # 配置与后端HTTPS连接的参数 proxy_ssl_verify off; # 因为后端是自签名证书临时关闭验证生产环境应配置信任证书 # proxy_ssl_trusted_certificate /etc/nginx/ssl/backend-ca.crt; # proxy_ssl_verify on; proxy_ssl_name $proxy_host; proxy_ssl_server_name on; # 超时设置 proxy_connect_timeout 75s; proxy_send_timeout 3600s; proxy_read_timeout 3600s; } } # HTTP重定向 server { listen 80; listen [::]:80; server_name api.example.com; return 301 https://$server_name$request_uri; }步骤3测试与调试语法检查sudo nginx -t重载配置sudo nginx -s reload从外部测试curl -v https://api.example.com/actuator/health查看Nginx日志tail -f /var/log/nginx/error.logtail -f /var/log/nginx/access.log(使用包含$scheme和$ssl_protocol的日志格式)直接测试后端在Nginx服务器上curl -vk https://192.168.1.10:9443/actuator/health确认后端服务本身是可用的。检查连接如果还有问题可以在Nginx服务器上用tcpdump抓包分析Nginx与后端服务器192.168.1.10:9443之间的通信看TCP连接是否建立是否有TLS握手。通过这样系统性的配置和排查The plain HTTP request was sent to HTTPS port这个报错就不再是一个黑盒错误而是指引你深入理解网络协议栈和Nginx配置的清晰路标。记住关键在于理清整个数据流中每一个环节对协议的期望和处理方式。

相关新闻

终极指南:3分钟解决Windows无法识别iPhone的USB网络共享问题

终极指南:3分钟解决Windows无法识别iPhone的USB网络共享问题

终极指南:3分钟解决Windows无法识别iPhone的USB网络共享问题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/…

2026/7/31 8:42:59阅读更多 →
应广PMS152 MCU开发实战:从核心特性到烧录量产全解析

应广PMS152 MCU开发实战:从核心特性到烧录量产全解析

1. 项目概述:初识应广PMS152这颗“小钢炮”最近在捣鼓一个超小型的温湿度监测节点,对MCU的尺寸、功耗和成本都卡得死死的。在翻遍了各大厂商的选型手册后,一颗来自应广科技(PADAUK)的PMS152成功引起了我的注意。它那SO…

2026/7/31 8:42:59阅读更多 →
三菱PLC控制四轴伺服系统的工业自动化实践

三菱PLC控制四轴伺服系统的工业自动化实践

1. 项目概述:四轴伺服定位系统的工业自动化实现这个项目展示了一个典型的工业自动化解决方案——使用三菱PLC控制四台伺服电机实现精确定位。作为一名在工业自动化领域摸爬滚打十年的工程师,我经常遇到类似的需求:从简单的单轴控制到复杂的多…

2026/7/31 8:42:59阅读更多 →
React 拖拽上传图片功能实战:从零到完整实现

React 拖拽上传图片功能实战:从零到完整实现

前言在现代 Web 应用中,拖拽上传已经成为提升用户体验的标配功能。用户只需将图片从文件管理器拖到网页中,系统就能自动识别、处理并上传文件。本文将带你从零开始实现一个完整的 React 拖拽上传功能,涵盖浏览器原生 API、react-dropzone 库集…

2026/7/31 13:52:59阅读更多 →
2026程序化交易新规落地:中低频多因子实盘架构重构与强化学习(RL)算法拆单实战

2026程序化交易新规落地:中低频多因子实盘架构重构与强化学习(RL)算法拆单实战

引言:7月新规重塑实盘交易范式 2026年7月24日,A股市场迎来了具有里程碑意义的监管时刻——《程序化交易管理实施细则》正式落地。新规对高频交易实施了极其严格的规制,明确限制了单日申报笔数、最高撤单率阈值,并全面收紧融券日内…

2026/7/31 13:52:59阅读更多 →
某乎爬虫进阶:爬取问题+回答+用户信息,构建知识图谱数据源

某乎爬虫进阶:爬取问题+回答+用户信息,构建知识图谱数据源

引言在信息过载的时代,如何从海量的UGC(用户生成内容)中高效提取结构化知识,是每一位数据从业者都在探索的问题。某乎作为中文互联网最大的知识分享社区之一,汇聚了数以亿计的问题、回答和用户互动数据,是构…

2026/7/31 13:52:59阅读更多 →
Spring Boot整合Spring AI:企业级AI应用开发指南

Spring Boot整合Spring AI:企业级AI应用开发指南

1. Spring Boot与Spring AI的快速整合指南在当今企业级应用开发领域,Spring Boot已经成为Java生态中构建微服务的首选框架。而随着AI技术的普及,Spring社区近期推出的Spring AI项目为开发者提供了将AI能力无缝集成到Spring应用中的便捷途径。本文将带你快…

2026/7/31 13:52:59阅读更多 →
Cloudflare 多账户管理:从痛点分析到开源方案实践

Cloudflare 多账户管理:从痛点分析到开源方案实践

背景 日常开发中经常同时用到多个 Cloudflare 账户——一个放博客域名,一个跑 Workers AI,还有一个管理十几条 DNS 记录。官方后台各功能分散在不同页面,切换账户需要反复登录,查配额、部署 Worker 这些操作非常繁琐。 于是做了…

2026/7/31 13:52:59阅读更多 →
2026论文分场景榜单[特殊字符]选题/写作/降重/答辩|各赛道最强工具盘点

2026论文分场景榜单[特殊字符]选题/写作/降重/答辩|各赛道最强工具盘点

别再看笼统综合排名!写论文不同阶段,适配工具完全不一样❌ 很多工具单项能打、全程拉胯,越用越返工。 整理2026五大论文核心场景专项排名,精准对标双检新规,每类赛道只选最强,帮你避开所有工具短板✅ &am…

2026/7/31 13:50:59阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →