HTTPレスポンスをコントロールする新しい方法

Deeplからの自動翻訳

4D 21から、4D開発者はシンプルな設定ファイルを使ってHTTPレスポンスを完全にコントロールできるようになりました:HTTPRules.jsonです。セキュリティを強化したいのか、パフォーマンスを最適化したいのか、静的リソースへのアクセスを管理したいのか、この機能を使えば、コードを一行も書くことなく、必要な柔軟性を得ることができます。
では、その機能と使い方を説明しよう。

ルールの適用方法

この機能を有効にするには、プロジェクトのSourcesフォルダにHTTPRules.jsonファイルを置きます。
または、settings.rules 属性でルールを定義し、 Web server.start( )関数に設定オブジェクトを渡すことで、プログラムでルールを定義することもできます。これは、既存のファイルで定義されたルールを置き換えます。

ファイルまたはsettings. rules 属性の内容は、ルールのコレクションです。
各ルールはオブジェクトであり、リクエストURIにマッチする正規表現パターン(regexPattern)によって定義されます。

ルールのアクションはその属性によって定義されます:

  • setHeadersHTTP レスポンスのヘッダーを修正する。
  • addHeadersHTTP レスポンスのヘッダーを修正する。
  • removeHeadersHTTPレスポンスからヘッダーを削除する。
  • denyAccessリソースへのアクセスを拒否または許可する。
  • redirectHTTPリクエストをリダイレクトする。
  • statusカスタムHTTPレスポンス・ステータスを定義する

HTTPサーバーがルールとともに起動されると、考慮されるルールはWeb server.rules 属性で取得できます。
ルールは順番に評価され、1つのリクエストに複数のルールを適用できることに注意してください。

アクションの説明

カスタムヘッダーの設定

HTTPレスポンスの既存のヘッダーを更新し、存在しない場合は作成することができます。
このアクションはsetHeaders 属性によって定義されます。これは、HTTPレスポンスに設定するキーと値のヘッダーペアを含むオブジェクトです。

{
"regexPattern":"/(.*)",
"setHeaders":{
"X-Frame-Options":"SAMEORIGIN",
"Content-Security-Policy":"default-src 'self'"
}
}.

このルールにより、すべてのHTTPレスポンスは、4D HTTPサーバーによって定義されたものに加えて、定義された値のX-Frame-Optionsと Content-Security-Policyヘッダーを含むことになります。

カスタムヘッダーの追加

HTTP レスポンスにカスタムヘッダーを追加できます。これは、クッキーのように複数のインスタンスを持つことができるヘッダーに特に便利です。
このアクションは、addHeaders 属性によって定義されます。これは、HTTPレスポンスに追加するキーと値のヘッダーペアを含むオブジェクトです。

{
"regexPattern":"/(.*)",
"addHeaders":{
"Set-Cookie":"myCookie=123456; Max-Age=14400"
}
} 。

このルールにより、すべてのHTTPレスポンスは、4D HTTPサーバー、またはあなた自身で定義されたものに加えて、定義された値を持つ別のSet-Cookieヘッダーを含むことになります。

ヘッダーの削除

レスポンスから不要なヘッダーを削除することができます。
このアクションはremoveHeaders 属性によって定義されます。これは、HTTPレスポンスから削除するヘッダーキーのコレクションです。

{
"regexPattern":"/(.*)",
"removeHeaders":["Server", "X-Frame-Options"]
}.

このルールでは、すべてのHTTPレスポンスヘッダからServerヘッダとX-Frame-Optionsヘッダが削除されます。

⚠️ ヘッダーの中には、更新、追加、削除できないものがあります。 Dateそして Content-Length.

リソースへのアクセスを拒否/許可する

デフォルトで 403 Forbidden ステータスを返すことで、特定の URI へのアクセスをブロックできます。
このアクションはdenyAccess 属性で定義されます。これはブール値で、アクセスを拒否するにはtrueを、許可するにはfalseを返します。

{
"regexPattern":"/private/(.*)",
"denyAccess": true,
}.

このルールでは、/private/フォルダとサブフォルダからのすべてのリソースは配信されません。

サブフォルダへのアクセスを明示的に許可することもできます:

例: {
"regexPattern":"/private/allowed/(.*)",
"denyAccess": false
}.

このルールでは、親/private/フォルダへのアクセスを拒否する前のルールが定義されていても、/private/allowed/フォルダとサブフォルダのすべてのリソースにアクセスできる。

リクエストのリダイレクト

リクエストを別の URL にリダイレクトできます。ステータスコードを指定できます (デフォルトでは恒久的なものは 301、一時的なものは 302)。
このアクションはredirect 属性で定義されます。これはリダイレクト元のURLを含むテキストです。

{
"regexPattern":"^/images/(.*)",
"redirect":"https://cdn.example.com/images/",
"status":301
}.

このルールでは、imagesサブフォルダのすべてのリソースが、定義されたCDNにリダイレクトされます。
正規表現パターンの先頭の”^”は、間違ったURIが返されるのを避けるために、リダイレクトのケースでは重要であることに注意してください。

カスタムステータスコードの設定

HTTPレスポンスのデフォルトのステータスコードを上書きすることができます。
このアクションはstatus 属性で定義されます。これは、HTTPレスポンスによってステータスコードとして返される数値です。

{
"regexPattern":"^/maintenance.html",
"status":503
} 。

このルールでは、maintenance.htmlページがリクエストされると、返されるステータスコードは503になります。

⚠️ 自分で定義したステータスが、HTTPサーバーから送信されるレスポンスと一致していることを確認してください!

アクションとルールの組み合わせ

いくつかのアクションは、同じ正規表現パターンを共有する場合、1つのルールにまとめることができます。

{
"regexPattern":"/docs/(.*).html",
"addedHeaders":{
"Cache-Control":"max-age=3600"
},
"removedHeaders":["X-Powered-By"]
}.

このルールは、docsサブフォルダーに置かれたすべてのHTMLファイルに適用される。

ルールを論理的な順序で組み合わせて、HTTPサーバーのレスポンスを完全に設定することもできます。

完全なルールコレクションの例

[
{
"comment":"All requests: allow GET method for, remove 'Server' header and set security headers",
"regexPattern":"/(.*)",
"setHeaders":{
"Allow":"GET",
"X-Frame-Options":"SAMEORIGIN",
"Content-Security-Policy":"default-src 'self'"
},
"removeHeaders":[
"Server"
]
},
{
"comment":"REST requests: allow POST method",
"regexPattern":"/rest/(.*)",
"addHeaders":{
"Allow":"POST"
}.
},
{
"comment":"「doc」フォルダ内のHTMLファイル:キャッシュ制御を設定する",
"regexPattern":"/docs/(.*).html",
"setHeaders":{
"Cache-Control":"Max-Age=3600"
},
"removeHeaders":[
"X-Powered-By"
]
},
{
comment":"Status 503 on 'maintenance' page",
"regexPattern":"^/maintenance.html",
"status":503
},
{
"comment":"Redirect CSS and JS files",
"regexPattern":"^(.*css|js)",
"redirect":"https://cdn.example.com/"
},
{
"comment":"Redirect images with permanent status code",
"regexPattern":"^(.*jpeg|png|gif)",
"redirect":"https://cdn.example.com/images/",
"status":301
},
{
"comment":"「private」フォルダに置かれたすべてのリソースのアクセスを拒否する",
"regexPattern":"/private/(.*)",
"denyAccess": true
},
{
"comment":"「private/allowed」フォルダに置かれたすべてのリソースへのアクセスを許可する",
"regexPattern":"/private/allowed/(.*)",
"denyAccess": false
}
].

まとめ

HTTPRules.jsonを使うことで、4Dはより強力で柔軟なHTTPサーバーになります。以下のことができるようになりました:

  • ヘッダーの追加、変更、削除
  • アクセスをブロックまたは許可する
  • リクエストのリダイレクト
  • カスタムステータスコードの設定

コードによる複雑なフィルタリングロジックは必要なく、HTTPRules.jsonファイルで設定するだけで実行できます!
そして、もしあなたのアプリケーションが、導入された環境や顧客によってカスタマイズされたルール(例えばセキュリティルール)を持つ必要がある場合、それは非常に簡単です。 Web serverコマンドで簡単にできます!
ウェブデプロイメントを簡素化する準備はできましたか?今すぐルールを使い始めましょう。

Avatar
- プロダクトオーナー - Damien Fuzeauは、2019年2月に4D Productチームに参加しました。プロダクトオーナーとして、ユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換することを担当しています。また、実装された機能が顧客のニーズを満たしているかどうかを確認することも彼の役割です。ナント大学のソフトウェア工学科を卒業。前職の会社では最初は開発者として(1997年に4Dを発見)、後にエンジニアリングマネージャーとソフトウェアアーキテクトとして、23年以上勤務しました。この会社は、4DのOEMパートナーであり、現在は数千のユーザーと数百のサーバーに向けて4Dベースのビジネスソフトを展開しています。ですから、Damienは、多言語環境での4D開発・導入に慣れています。