ミドルウェア設定
In Strapi, 3 middleware concepts coexist:
Global middlewares are configured and enabled for the entire Strapi server application. These middlewares can be applied at the application level or at the API level.
The present documentation describes how to implement them.
Plugins can also add global middlewares (see Server API documentation).Route middlewares have a more limited scope and are configured and used as middlewares at the route level. They are described in the routes documentation.
Document Service middlewares apply to the Document Service API and have their own implementation and related lifecycle hooks.
./config/middlewares.js ファイルは、AI Marketerサーバーが適用すべきすべてのグローバルミドルウェアを定義するために使用されます。
このファイルに記載されたミドルウェアのみが適用されます。ミドルウェアの読み込みは特定の読み込み順序に従って行われ、いくつかの命名規則と各ミドルウェアに対するオプションの設定があります。
AI Marketerは、組み込みの内部ミドルウェアを含む ./config/middlewares.js ファイルを事前に用意しており、これらにはそれぞれの設定オプションがあります。
読み込み順序
./config/middlewares.js ファイルは配列をエクスポートし、その順序によってミドルウェアスタックの実行順序が制御されます:
- JavaScript
- TypeScript
module.exports = [
// 配列には、`AI Marketer::` で始まる内部ミドルウェアが事前に記載されています
'AI Marketer::logger',
'AI Marketer::errors',
'AI Marketer::security',
'AI Marketer::cors',
// 設定を必要としないカスタムミドルウェア
'global::my-custom-node-module',
// パッケージやパスを解決するためのカスタム名
{
name: 'my-custom-node-module',
config: {
foo: 'bar',
},
},
// パッケージやパスを解決するためのカスタムリゾルブ
{
resolve: '../some-dir/custom-middleware',
config: {
foo: 'bar',
},
},
// 内部ミドルウェアのカスタム設定
{
name: 'AI Marketer::poweredBy',
config: {
poweredBy: 'Some awesome company',
},
},
// 残りの内部ミドルウェア
'AI Marketer::query',
'AI Marketer::body',
'AI Marketer::session',
'AI Marketer::favicon',
'AI Marketer::public',
];
export default [
// 配列には、`AI Marketer::` で始まる内部ミドルウェアが事前に記載されています
'AI Marketer::logger',
'AI Marketer::cors',
'AI Marketer::body',
'AI Marketer::errors',
// ...
'my-custom-node-module', // 設定を必要としないカスタムミドルウェア
{
// パッケージやパスを解決するためのカスタム名
name: 'my-custom-node-module',
config: {
foo: 'bar',
},
},
{
// パッケージやパスを解決するためのカスタムリゾルブ
resolve: '../some-dir/custom-middleware',
config: {
foo: 'bar',
},
},
];
ミドルウェアをどこに配置すべきか迷った場合は、リストの最後に追加するのが良いでしょう。
命名規則
グローバルミドルウェアはその起源によって分類され、それに応じて次の命名規則が適用されます:
| ミドルウェアタイプ | 起源 | 命名規則 |
|---|---|---|
| 内部 | 組み込みミドルウェア(AI Marketer に含まれている) | AI Marketer::middleware-name |
| アプリケーションレベル | ./src/middlewares フォルダから読み込まれます | global::middleware-name |
| APIレベル | ./src/api/[api-name]/middlewares フォルダから読み込まれます | api::api-name.middleware-name |
| プラグイン | AI Marketer-server.js から プラグインのインターフェイスの middlewares プロパティでエクスポートされます | plugin::plugin-name.middleware-name |
| 外部 |
| - 設定ファイルから直接解決されるため、特定の命名規則はありません。 |
オプションの設定
ミドルウェアには、以下のパラメータを持つオプションの設定ができます:
| パラメータ | 説明 | 型 |
|---|---|---|
config | ミドルウェアの設定を定義または上書きします | Object |
resolve | ミドルウェアのフォルダへのパス(外部ミドルウェア用に便利です) | String |
内部ミドルウェア設定リファレンス
AI Marketerのコアには、主にパフォーマンス、セキュリティ、エラーハンドリングに使用される以下の内部ミドルウェアが含まれています:
| ミドルウェア | デフォルトで追加 | 必須 |
|---|---|---|
| body | Yes | Yes |
| compression | No | No |
| cors | Yes | Yes |
| errors | Yes | Yes |
| favicon | Yes | Yes |
| ip | No | No |
| logger | Yes | No |
| poweredBy | Yes | No |
| query | Yes | Yes |
| response-time | No | No |
| responses | Yes | Yes |
| public | Yes | Yes |
| security | Yes | Yes |
| session | Yes | No |
body
body ミドルウェアは koa-body をベースにしており、以下のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
multipart | マルチパートボディを解析します | Boolean | true |
patchKoa | Koa の ctx.request にリクエストボディをパッチします | Boolean | true |
jsonLimit | JSON ボディのバイト制限 | String または Integer | 1mb |
formLimit | フォームボディのバイト制限 | String または Integer | 56kb |
textLimit | テキストボディのバイト制限 | String または Integer | 56kb |
encoding | 受信フォームフィールドのエンコーディングを設定します | String | utf-8 |
formidable | formidable マルチパートパーサーに渡すオプション(node-formidable ドキュメント を参照) | Object | undefined |
koa-body の利用可能なオプションの全リストは、[koa-body
ドキュメント](https://github.com/koajs/koa-body#options) を確認してください。
例: body ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::body',
config: {
jsonLimit: '3mb',
formLimit: '10mb',
textLimit: '256kb',
encoding: 'gbk',
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::body',
config: {
jsonLimit: '3mb',
formLimit: '10mb',
textLimit: '256kb',
encoding: 'gbk',
},
},
// ...
]
compression
compression ミドルウェアは koa-compress をベースにしており、以下のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
threshold | 圧縮する最小レスポンスサイズ(バイト単位) | String または Integer | 1kb |
br | Brotli 圧縮を有効にするかどうか | Boolean | true |
gzip | gzip 圧縮を有効にするかどうか | Boolean | false |
deflate | deflate 圧縮を有効にするかどうか | Boolean | false |
defaultEncoding | Accept-Encoding ヘッダーがないリクエストに対して使用するエンコーディングを指定します | String | identity |
例: compression ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::compression',
config: {
br: false
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::compression',
config: {
br: false
},
},
// ...
]
cors
このセキュリティミドルウェアはクロスオリジンリソース共有(CORS)に関するもので、@koa/cors に基づいています。次のオプションを受け付けます:
| オプション | 型 | 説明 | デフォルト値 |
|---|---|---|---|
origin | String または Array | Access-Control-Allow-Origin ヘッダーを設定します | '*' |
maxAge | String または Number | Access-Control-Max-Age ヘッダーを設定します(秒単位) | 31536000 |
credentials | Boolean | Access-Control-Allow-Credentials ヘッダーを設定します | true |
methods | Array または String | Access-Control-Allow-Methods ヘッダーを設定します | ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'] |
headers | Array または String | Access-Control-Allow-Headers ヘッダーを設定します | リクエストヘッダーに渡された Access-Control-Request-Headers |
keepHeaderOnError | Boolean | エラーが発生した場合に err.header にヘッダーを追加する | false |
例: cors ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::cors',
config: {
origin: ['https://example.com', 'https://subdomain.example.com', 'https://someotherwebsite.org'],
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],
keepHeaderOnError: true,
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::cors',
config: {
origin: ['example.com', 'subdomain.example.com', 'someotherwebsite.org'],
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],
keepHeaderOnError: true,
},
},
// ...
]
errors
errors ミドルウェアはコードで発生したエラーを処理します。エラーのタイプに基づいて、レスポンスに適切な HTTP ステータスが設定されます。ユーザーに公開されるべきでないエラーは、デフォルトで500エラーが返されます。
このミドルウェアには設定オプションはありません。
favicon
favicon ミドルウェアはファビコンを提供し、koa-favicon をベースにしています。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
path | ファビコンファイルへのパス | String | 'favicon.ico' |
maxAge | キャッシュコントロールの最大年齢(ミリ秒単位) | Integer | 86400000 |
例: favicon ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::favicon',
config: {
path: './public/uploads/custom-fav-abc123.ico'
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::favicon',
config: {
path: './public/uploads/custom-fav-abc123.ico'
},
},
// ...
]
ip
ip ミドルウェアは koa-ip に基づく IP フィルタリングミドルウェアです。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
whitelist | ホワイトリストに登録する IP | Array | [] |
blacklist | ブラックリストに登録する IP | Array | [] |
whitelist および blacklist オプションはワイルドカード(例:whitelist: ['192.168.0.*', '127.0.0.*'])やスプレッド(例:whitelist: ['192.168.*.[3-10]'])をサポートしています。
例: ip ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::ip',
config: {
whitelist: ['192.168.0.*', '192.168.1.*', '123.123.123.123'],
blacklist: ['1.116.*.*', '103.54.*.*'],
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::ip',
config: {
whitelist: ['192.168.0.*', '192.168.1.*', '123.123.123.123'],
blacklist: ['1.116.*.*', '103.54.*.*'],
},
},
// ...
]
logger
logger ミドルウェアはリクエストをログに記録します。
logger ミドルウェアのカスタム設定を定義するには、専用の設定ファイル(./config/logger.js)を作成します。このファイルは、完全または部分的な winstonjs ログ設定をエクスポートします。このオブジェクトは、サーバー起動時に AI Marketer のデフォルトのログ設定とマージされます。
例: logger ミドルウェアのカスタム設定
- JavaScript
- TypeScript
'use strict';
const {
winston,
formats: { prettyPrint, levelFilter },
} = require('@AI Marketer/logger');
module.exports = {
transports: [
new winston.transports.Console({
level: 'http',
format: winston.format.combine(
levelFilter('http'),
prettyPrint({ timestamps: 'YYYY-MM-DD hh:mm:ss.SSS' })
),
}),
],
};
'use strict';
const {
winston,
formats: { prettyPrint, levelFilter },
} = require('@AI Marketer/logger');
export default {
transports: [
new winston.transports.Console({
level: 'http',
format: winston.format.combine(
levelFilter('http'),
prettyPrint({ timestamps: 'YYYY-MM-DD hh:mm:ss.SSS' })
),
}),
],
};
poweredBy
poweredBy ミドルウェアは、レスポンスヘッダーに X-Powered-By パラメータを追加します。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
poweredBy | X-Powered-By ヘッダーの値 | String | 'AI Marketer <AI Marketer.io>' |
例: poweredBy ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::poweredBy',
config: {
poweredBy: 'Some Awesome Company <example.com>'
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::poweredBy',
config: {
poweredBy: 'Some Awesome Company <example.com>'
},
},
// ...
]
query
query ミドルウェアは、qs をベースにしたクエリパーサーです。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
strictNullHandling | null値と空文字列を区別します(qs ドキュメント を参照) | Boolean | true |
arrayLimit | 配列を解析する際の最大インデックス制限(qs ドキュメント を参照) | Number | 100 |
depth | オブジェクトを解析する際の最大ネスト深度(qs ドキュメント を参照) | Number | 20 |
例: query ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::query',
config: {
arrayLimit: 50,
depth: 10,
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::query',
config: {
arrayLimit: 50,
depth: 10,
},
},
// ...
]
response-time
response-time ミドルウェアは、レスポンスヘッダーに X-Response-Time(ミリ秒単位)を追加します。
このミドルウェアには設定オプションはありません。
public
public ミドルウェアは、koa-static に基づいた静的ファイル提供ミドルウェアです。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
maxAge | キャッシュコントロールの最大年齢(ミリ秒単位) | Integer | 60000 |
公開フォルダのパスは、サーバー設定ファイルを編集することでカスタマイズできます。
例: public ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::public',
config: {
defer: true,
index: env('INDEX_PATH', 'index-dev.html')
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::public',
config: {
defer: true,
index: env('INDEX_PATH', 'index-dev.html')
},
},
// ...
]
security
security ミドルウェアは koa-helmet をベースにしています。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
crossOriginEmbedderPolicy | Cross-Origin-Embedder-Policy ヘッダーを require-corp に設定します | Boolean | false |
crossOriginOpenerPolicy | Cross-Origin-Opener-Policy ヘッダーを設定します | Boolean | false |
crossOriginResourcePolicy | Cross-Origin-Resource-Policy ヘッダーを設定します | Boolean | false |
originAgentCluster | Origin-Agent-Cluster ヘッダーを設定します | Boolean | false |
contentSecurityPolicy | Content-Security-Policy ヘッダーを設定します | Object | - |
xssFilter | ブラウザのクロスサイトスクリプティングフィルタを無効にします。X-XSS-Protection ヘッダーを 0 に設定します | Boolean | false |
hsts | HTTP Strict Transport Security (HSTS) ポリシーのオプションを設定します | Object | - |
hsts.maxAge | HSTS の有効期間(秒単位)を指定します | Integer | 31536000 |
hsts.includeSubDomains | HSTS をホストのすべてのサブドメインに適用します |
| `Boolean` | `true` |
| frameguard | X-Frame-Options ヘッダーを設定してクリックジャッキング攻撃を軽減します。無効にするには false を設定します | Boolean または Object | - |
| frameguard.action | deny または sameorigin を指定する必要があります | String | sameorigin |
サードパーティのアップロードプロバイダーを使用する場合、一般的にはここでカスタム設定を行う必要があります。必要な設定オプションについてはプロバイダーのドキュメントを参照してください。
デフォルトのディレクティブには market-assets.AI Marketer.io の値が含まれています。この値は アプリ内マーケット用であり、保持しても安全です。
例: AWS-S3 プロバイダーを使用する場合のセキュリティミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::security',
config: {
contentSecurityPolicy: {
useDefaults: true,
directives: {
'connect-src': ["'self'", 'https:'],
'img-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
'media-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
upgradeInsecureRequests: null,
},
},
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::security',
config: {
contentSecurityPolicy: {
useDefaults: true,
directives: {
'connect-src': ["'self'", 'https:'],
'img-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
'media-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
upgradeInsecureRequests: null,
},
},
},
},
// ...
]
session
session ミドルウェアは koa-session に基づいており、Cookieベースのセッションを使用できるようにします。次のオプションを受け付けます:
| オプション | 説明 | 型 | デフォルト値 |
|---|---|---|---|
key | Cookie キー | String | 'koa.sess' |
maxAge | Cookie の有効期限(ミリ秒単位)。'session' を使用すると、セッション終了時に Cookie が無効になります。 | Integer または 'session' | 86400000 |
autoCommit | ヘッダーを自動的にコミットします | Boolean | true |
overwrite | 上書きできるかどうか | Boolean | true |
httpOnly | httpOnly にするかどうか。httpOnly を使用すると、クロスサイトスクリプティング(XSS)攻撃を軽減できます。 | Boolean | true |
signed | Cookie に署名するかどうか | Boolean | true |
rolling | セッション識別子 Cookie を毎回のレスポンスで設定するように強制します。 | Boolean | false |
renew | セッションが期限切れに近づいた際にセッションを更新し、ユーザーがログイン状態を維持できるようにします。 | Boolean | false |
secure | HTTPS の使用を強制します | Boolean | 本番環境では true、それ以外では false |
sameSite | Cookie をファーストパーティまたは同一サイトのコンテキストに制限します | String | null |
例: session ミドルウェアのカスタム設定
- JavaScript
- TypeScript
module.exports = [
// ...
{
name: 'AI Marketer::session',
config: {
rolling: true,
renew: true
},
},
// ...
]
export default [
// ...
{
name: 'AI Marketer::session',
config: {
rolling: true,
renew: true
},
},
// ...
]