コンテンツへスキップ

CORSミドルウェア

Cloudflare WorkersをWeb APIとして使用し、外部フロントエンドアプリケーションから呼び出す多くのユースケースがあります。それらに対してCORSを実装する必要があります。ミドルウェアを使用してこれを行いましょう。

インポート

ts
import { Hono } from 'hono'
import { cors } from 'hono/cors'

使用方法

ts
const app = new Hono()

app.use('/api/*', cors())
app.use(
  '/api2/*',
  cors({
    origin: 'http://example.com',
    allowHeaders: ['X-Custom-Header', 'Upgrade-Insecure-Requests'],
    allowMethods: ['POST', 'GET', 'OPTIONS'],
    exposeHeaders: ['Content-Length', 'X-Kuma-Revision'],
    maxAge: 600,
    credentials: true,
  })
)

app.all('/api/abc', (c) => {
  return c.json({ success: true })
})
app.all('/api2/abc', (c) => {
  return c.json({ success: true })
})

複数のオリジン

ts
app.use(
  '/api3/*',
  cors({
    origin: ['https://example.com', 'https://example.org'],
  })
)

// Or you can use "function"
app.use(
  '/api4/*',
  cors({
    // `c` is a `Context` object
    origin: (origin, c) => {
      return origin.endsWith('.example.com')
        ? origin
        : 'http://example.com'
    },
  })
)

オプション

オプション origin: string | string[] | (origin:string, c:Context) => string

"Access-Control-Allow-Origin" CORSヘッダーの値。origin: (origin) => (origin.endsWith('.example.com') ? origin : 'http://example.com')のようなコールバック関数も渡すことができます。デフォルトは*です。

オプション allowMethods: string[]

"Access-Control-Allow-Methods" CORSヘッダーの値。デフォルトは['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH']です。

オプション allowHeaders: string[]

"Access-Control-Allow-Headers" CORSヘッダーの値。デフォルトは[]です。

オプション maxAge: number

"Access-Control-Max-Age" CORSヘッダーの値。

オプション credentials: boolean

"Access-Control-Allow-Credentials" CORSヘッダーの値。

オプション exposeHeaders: string[]

"Access-Control-Expose-Headers" CORSヘッダーの値。デフォルトは[]です。

環境依存のCORS設定

開発環境や本番環境など、実行環境に応じてCORS設定を調整する必要がある場合、環境変数から値を注入すると、アプリケーションが自身の環境を認識する必要がなくなるため便利です。詳細は以下の例を参照してください。

ts
app.use('*', async (c, next) => {
  const corsMiddlewareHandler = cors({
    origin: c.env.CORS_ORIGIN,
  })
  return corsMiddlewareHandler(c, next)
})

MITライセンスの下でリリースされています。