nginx用return返回json需同时满足三条件:显式指定状态码(如return 200)、设置default_type application/json、json字符串用单引号包裹且无换行;中文乱码须加add_header content-type 'application/json; charset=utf-8'。

直接用 return 指令配合 default_type application/json 就能返回 JSON,但漏掉关键配置项会导致浏览器下载文件、中文乱码或状态码异常——这不是功能问题,而是响应头和语法细节没对齐。
location 中用 return 返回 JSON 的基本写法
必须同时满足三个条件:状态码显式指定、default_type 设置正确、JSON 字符串用单引号包裹且无换行。
-
return后面的状态码不能省略,比如return 200,不能只写return -
default_type application/json必须存在,否则浏览器收不到Content-Type,会把响应当二进制文件下载 - JSON 字符串必须用单引号(
'{}'),双引号在 Nginx 配置里会被 shell 或解析器提前截断 - 字符串内不能有未转义的换行,否则配置校验失败:
nginx -t会报invalid number of arguments
示例:
location ~ ^/api/status$ {
default_type application/json;
return 200 '{"status":"ok","uptime":12345}';
}
中文 JSON 返回乱码的根源和修复
Nginx 默认不声明字符集,Linux 系统用 UTF-8,但浏览器(尤其旧版 Chrome / IE)在没收到 charset 时可能 fallback 到 GBK,导致中文显示为方块或问号。
- 不要只靠
default_type application/json—— 它只设 MIME 类型,不带编码信息 - 必须显式声明 UTF-8:用
add_header Content-Type 'application/json; charset=utf-8',或更简洁的charset utf-8 -
charset指令只影响text/*类型,对application/json无效,所以优先选add_header
正确写法:
location ~ ^/api/hello$ {
default_type application/json;
add_header Content-Type 'application/json; charset=utf-8';
return 200 '{"msg":"你好,世界"}';
}
给限流/错误场景返回自定义 JSON(如 429)
默认的 limit_req 触发时返回 503,而 429 是更语义化的“Too Many Requests”,但 Nginx 不会自动把它映射到自定义响应,得手动桥接。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 先在
http块定义限流区域:limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s - 在
server或location中启用:limit_req zone=api burst=10 nodelay - 用
error_page 429 = @rate_limited把 429 转给命名 location 处理 - 命名 location 里必须用
return 429+add_header Content-Type,否则仍返回默认 HTML 错误页
片段示例:
server {
error_page 429 = @rate_limited;
<pre class="brush:php;toolbar:false;">location @rate_limited {
add_header Content-Type 'application/json; charset=utf-8';
return 429 '{"code":429,"message":"请求过于频繁,请稍后再试"}';
}
location /api/ {
limit_req zone=api burst=10 nodelay;
# ... 其他配置
}}
用正则捕获 URL 参数动态构造 JSON
想根据路径返回不同内容(比如 /user/123 → {"id":123}),不能靠后端,Nginx 本身支持基础变量提取,但要注意类型和转义。
- 用
location ~ ^/user/(\d+)$捕获数字,$1即 ID,但它是字符串,JSON 中数字无需引号,所以得拼成"id":$1 - 所有变量插值都发生在字符串内部,
return不支持表达式计算,所以{"id":$1}是合法的,但{"id":$1+1}会报错 - 如果要拼接中文或特殊字符,确保整个 JSON 字符串仍被单引号包裹,且内部单引号需转义为
\' - 避免用
(.*)匹配任意内容——容易被恶意路径注入双引号或大括号,破坏 JSON 结构
安全示例(仅允许数字 ID):
location ~ ^/user/(\d+)$ {
default_type application/json;
add_header Content-Type 'application/json; charset=utf-8';
return 200 '{"id":$1,"type":"user"}';
}
最易被忽略的是:Nginx 的 return 不做 JSON 格式校验,哪怕你写成 '{"key": "val}'(缺右引号),它也照常返回并 HTTP 200,但前端 JSON.parse() 直接抛错。上线前务必用 curl -v 实际请求验证响应体和 header。










