📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

http.cors.allow-methods 配置项用于指定在跨域资源共享(CORS)请求中允许浏览器使用的 HTTP 方法列表

当浏览器发送跨域请求的预检(OPTIONS)请求时,服务器会在 Access-Control-Allow-Methods 响应头中返回允许的 HTTP 方法。

配置项属性 #

  • 配置路径: http.cors.allow-methods
  • 数据类型: String(逗号分隔的字符串列表)
  • 默认值: "OPTIONS,HEAD,GET,POST,PUT,DELETE"
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)

配置项详解 #

工作机制 #

CORS 预检请求流程

浏览器准备发送 PUT 请求
    │
    ↓
发送 OPTIONS 预检请求
    │
    ↓
包含请求的方法信息
Access-Control-Request-Method: PUT
    │
    ↓
服务器检查 allow-methods 配置
    │
    ├──────── 方法在允许列表中 ✅
    │              ↓
    │         返回成功响应
    │              ↓
    │         Access-Control-Allow-Methods:
    │         OPTIONS,HEAD,GET,POST,PUT,DELETE
    │              ↓
    │         浏览器发送实际 PUT 请求
    │
    └──────── 方法不在允许列表中 ❌
                       ↓
                  返回错误响应
                       ↓
                  浏览器阻止实际请求

HTTP 方法说明 #

默认允许的方法:

OPTIONS:
- 作用: 预检请求,用于探测服务器支持的 CORS 功能
- 必需: CORS 预检必须包含此方法

HEAD:
- 作用: 获取资源的头部信息,不返回实际内容
- 用途: 检查资源是否存在或获取元数据

GET:
- 作用: 获取资源
- 用途: 查询数据、搜索、获取集群状态

POST:
- 作用: 创建资源或执行操作
- 用途: 创建索引、执行搜索、批量操作

PUT:
- 作用: 更新或创建资源
- 用途: 创建索引、更新映射、更新文档

DELETE:
- 作用: 删除资源
- 用途: 删除索引、删除文档

简单请求 vs 非简单请求 #

简单请求(无需预检):
- 方法: GET, HEAD, POST
- 头部: 仅限安全头部
- 直接发送请求

非简单请求(需要预检):
- 方法: PUT, DELETE, PATCH 等
- 头部: 包含自定义头部
- Content-Type: application/json
1. 先发送 OPTIONS 预检
2. 检查 allow-methods
3. 再发送实际请求

配置建议 #

默认配置(标准 CRUD) #

http:
  cors:
    enabled: true
    allow-origin: "*"
    allow-methods: "OPTIONS,HEAD,GET,POST,PUT,DELETE"  # 默认值

建议: 保持默认值。适用于大多数 RESTful API 场景。

RESTful API 完整配置 #

http:
  cors:
    enabled: true
    allow-origin: "*"
    allow-methods: "OPTIONS,HEAD,GET,POST,PUT,PATCH,DELETE"

建议: 添加 PATCH 方法。当需要支持部分更新操作时使用。

只读访问配置 #

http:
  cors:
    enabled: true
    allow-origin: "*"
    allow-methods: "OPTIONS,HEAD,GET"

建议: 只包含安全方法。当需要只读访问时使用。

完整方法配置 #

http:
  cors:
    enabled: true
    allow-origin: "https://example.com"
    allow-methods: "OPTIONS,GET,HEAD,POST,PUT,PATCH,DELETE"

建议: 包含所有常用方法。生产环境的完整配置。

代码示例 #

easysearch.yml 基础配置 #

http:
  cors:
    enabled: true
    allow-origin: "*"
    allow-methods: "OPTIONS,HEAD,GET,POST,PUT,DELETE"

开发环境配置 #

http:
  cors:
    enabled: true
    allow-origin: "http://localhost:3000"
    allow-methods: "OPTIONS,HEAD,GET,POST,PUT,PATCH,DELETE"

只读 API 配置 #

http:
  cors:
    enabled: true
    allow-origin: "https://public.example.com"
    allow-methods: "OPTIONS,HEAD,GET"
    allow-credentials: false

相关配置 #

配置项作用默认值
http.cors.enabled是否启用 CORSfalse
http.cors.allow-origin允许的来源域名-
http.cors.allow-methods允许的 HTTP 方法OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers允许的请求头X-Requested-With,Content-Type,Content-Length
http.cors.allow-credentials是否允许凭证false
http.cors.max-age预检请求缓存时间1728000

Easysearch API 方法使用 #

常用 API 方法分类 #

集群管理 API:
GET  /_cluster/health
GET  /_cluster/state
PUT  /_cluster/settings
POST /_cluster/reroute

索引管理 API:
PUT    /{index}
DELETE /{index}
GET    /{index}/_mapping
PUT    /{index}/_mapping

文档操作 API:
GET    /{index}/_doc/{id}
POST   /{index}/_doc
PUT    /{index}/_doc/{id}
DELETE /{index}/_doc/{id}
POST   /{index}/_update

搜索 API:
GET /{index}/_search
POST /{index}/_search

方法与权限对应 #

安全方法(只读):
- GET: 查询数据
- HEAD: 检查资源存在
- OPTIONS: 预检请求

修改方法:
- POST: 创建资源、执行操作
- PUT: 完整更新资源
- PATCH: 部分更新资源
- DELETE: 删除资源

使用场景 #

推荐使用默认配置的场景 #

  • 标准 CRUD 应用: 需要完整的增删改查功能
  • RESTful API: 使用标准的 REST 架构
  • 数据管理: 需要管理索引和文档

推荐添加 PATCH 的场景 #

  • 部分更新: 需要支持部分文档更新
  • 现代 API: 遵循现代 REST API 最佳实践
  • 前端框架: 使用支持 PATCH 的前端库

推荐限制为只读的场景 #

  • 公开数据: 只提供数据查询服务
  • 报表系统: 只需要读取数据生成报表
  • 监控面板: 只需要展示集群状态

预检请求示例 #

浏览器准备发送 PUT 请求:

OPTIONS /my_index/_doc/1 HTTP/1.1
Host: easysearch.example.com
Origin: https://app.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type


服务器返回响应:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 1728000


浏览器检查响应后发送实际请求:

PUT /my_index/_doc/1 HTTP/1.1
Host: easysearch.example.com
Origin: https://app.example.com
Content-Type: application/json

{ "field": "value" }

安全注意事项 #

最小权限原则 #

只开放需要的方法

公开 API:
http.cors.allow-methods: "OPTIONS,HEAD,GET"
(只允许查询,不允许修改)

内部 API:
http.cors.allow-methods: "OPTIONS,HEAD,GET,POST,PUT,DELETE"
(允许完整的 CRUD 操作)

方法安全建议 #

安全方法(可公开):
- GET: 不修改数据
- HEAD: 只获取元数据
- OPTIONS: 预检请求

不安全方法(需要认证):
- POST: 可能创建资源
- PUT: 可能修改资源
- DELETE: 可能删除资源
- PATCH: 可能修改资源

注意事项 #

  1. OPTIONS 必需: 必须包含 OPTIONS 方法,否则 CORS 预检会失败。

  2. 方法名大小写: 方法名必须使用大写,用逗号分隔。

  3. 与 allow-headers 配合: 某些方法需要特定的请求头才能正常工作。

  4. 预检请求: 任何非简单方法都会触发 OPTIONS 预检请求。

  5. 动态更新: 此配置支持动态更新,修改后立即生效。

  6. 与认证配合: 修改操作建议配合认证使用,避免安全问题。

  7. 日志监控: 监控被拒绝的 CORS 预检请求,及时发现配置问题。

  8. 浏览器限制: 某些浏览器对允许的方法有额外的限制。

  9. 与 HTTP 规范一致: 建议遵循 HTTP 规范的方法语义。

  10. 测试验证: 配置变更后需要测试所有跨域请求是否正常工作。