メインコンテンツまでスキップ
バージョン: 21 R2 BETA

HTTP ルール

4D Web サーバーで受信される任意のリクエスト(REST リクエストも含めます)に対してHTTP レスポンスヘッダーを管理するHTTP ルールを定義することができます。 HTTP ヘッダーの追加、変更、削除、リダイレクトの送信あるいはHTTP ステータスの設定などを行うことができます。 この機能はヘッダの管理に基づいてセキュリティポリシーを実装したい様な場合に有用です。

HTTP ルールを定義するためには、管理したいURL パターンを宣言するための正規表現を書くのに加えて、レスポンスヘッダーの編集の方法を定義します。 これらのルールは、プロジェクトフォルダ内に保存されているHTTPRules.json ファイルを使用するか、あるいはWeb サーバーオブジェクトのstart() 関数のsettings 引数を使用することで設定可能です。

要件

HTTP ルールは以下のコンテキストでサポートされています:

ルールの設定方法

以下の方法で、HTTP レスポンスルールを宣言することができます:

  • プロジェクトのProject/Sources フォルダ内に保存されているHTTPRules.json という名前の設定ファイルを使用する。 設定したルールは、Web サーバーが起動したときにロードされて適用されます。
  • 任意のWeb サーバーオブジェクトに対して、start() 関数のsettings 引数内で設定された.rules プロパティを使用する:
WEB Server.start($settings.rules) //Web サーバー開始時にルールを設定する

HTTPRules.json ファイルと、有効な$settings.rules を持った WEB Server コマンドの両方が呼び出された場合、WEB Server コマンドの方が優先されます。

リクエストのURI がRegEx(正規表現)パターンのいずれにも合致しない場合、Web サーバーはデフォルトのレスポンスを返します。

ルールの定義

HTTPRules.json ファイルまたは.rules プロパティは、ルールオブジェクト のコレクションを格納している必要があります。

ルールオブジェクトは以下の様に定義されます:

  • URL パターンを記述するRegEx(正規表現)。例: "^(.*\.(jpg|jpeg|png|gif))"
  • HTTP レスポンスに対して実行するアクションの名前。例: "removeHeaders"
  • アクションの値。例: "X-Unwanted-Header1"

その他のプロパティは無視されます。

URL パターン

URL パターンは、正規表現 を使用して与えられます。 正規表現パターンを宣言するためには、"RegExPattern" プロパティ名を使用します。

例: "RegExPattern": "/Test/Authorized/(.*)"

Web サーバーがリクエストを受信すると、すべての URL パターンが指定された順番で順次トリガーされ、全ての合致するパターンが実行されます。 複数のアクションが同様のリソースを編集しようとした場合、最後に実行されたアクションのみが考慮されます。

アクション

以下のアクションキーワードがサポートされています:

キーワード値の型説明
DescriptionテキストまたはテキストのコレクションHTTP レスポンスから削除するヘッダー。 削除するヘッダーがレスポンスヘッダー内に存在しない場合は無視されます。
addHeadersObjectHTTP レスポンスに追加するヘッダーのname(テキスト)とvalue(テキスト)。
setHeadersObjectHTTP レスポンス内で編集するヘッダーのname (テキスト)とvalue (テキスト)。 編集するヘッダーがレスポンスヘッダー内に存在しない場合は、それが追加されます。
denyAccessBooleanリソースへのアクセスを今日日するにはtrue、アクセスを許可するにはfalse。 リソースへのアクセスが拒否された場合、Web サーバーはデフォルトで403 ステータスを返します。
redirectTextリダイレクト URL。 リダイレクトがトリガーされた場合、Web サーバーはデフォルトで302 ステータスを返します。
statusNumberHTTP ステータス

変更不可なヘッダー

一部のヘッダーは追加、変更、削除ができません:

ヘッダー追加設定削除
Date×××
Content-Length×××
Content-Encoding×××
Vary××
Set-CookieCookie を追加する×

これらのヘッダーに対する認証されていない変更はエラーを生成することはしませんが、それらの変更は無視されます。

現在のルール

Web サーバーオブジェクトの.rules プロパティ を使用することで、現在のルールを知ることができます:

var $rules : Collection
$rules:=WEB Server.rules //現在のルール

例題

ルールは、HTTPRules.json ファイルまたはWeb サーバー関数の.start() 関数のsettings 引数を使用することで、設定することができます。

HTTPRules.json ファイルを使用して設定する


[
{
"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": "HTML files in 'doc' folder: set cache control",
"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": "^(.*\\\\.(jpg|jpeg|png|gif))",
"redirect": "https://cdn.example.com/images/",
"status": 301
},
{
"comment": "Deny access for all resources placed in the 'private' folder",
"regexPattern": "/private/(.*)",
"denyAccess": true
},
{
"comment": "Allow access to all resources placed in the 'private/allowed' folder",
"regexPattern": "/private/allowed/(.*)",
"denyAccess": false
}
]

settings 引数を使用して設定する

var $rule:={}

var $settings:={}

$settings.rules:=[]

$rule:={}
$rule.comment:="All requests: allow GET method for, remove 'Server' header and set security headers"
$rule.regexPattern:="/(.*)"
$rule.setHeaders:={Allow: "GET"}
$rule.setHeaders["X-Frame-Options"]:="SAMEORIGIN"
$rule.setHeaders["Content-Security-Policy"]:="default-src 'self'"
$rule.removeHeaders:=["Server"]
$settings.rules.push($rule)

$rule:={}
$rule.comment:="REST requests: allow POST method"
$rule.regexPattern:="/rest/(.*)"
$rule.addHeaders:={Allow: "POST"}
$settings.rules.push($rule)

$rule:={}
$rule.comment:="HTML files in 'doc' folder: set cache control"
$rule.regexPattern:="/docs/(.*).html"
$rule.setHeaders:={}
$rule.setHeaders["Cache-Control"]:="max-age=3600"
$rule.removeHeaders:=["X-Powered-By"]
$settings.rules.push($rule)

$rule:={}
$rule.comment:="Status 503 on 'maintenance' page"
$rule.regexPattern:="^/maintenance.html"
$rule.status:=503
$settings.rules.push($rule)

$rule:={}
$rule.comment:="Redirect CSS and JS files"
$rule.regexPattern:="^(.*\\\\.(css|js))"
$rule.redirect:="https://cdn.example.com/"
$settings.rules.push($rule)

$rule:={}
$rule.comment:="Redirect images with permanent status code"
$rule.regexPattern:="^(.*\\\\.(jpg|jpeg|png|gif))"
$rule.redirect:="https://cdn.example.com/images/"
$rule.status:=301
$settings.rules.push($rule)

$rule:={}
$rule.comment:="Deny access for all resources placed in the 'private' folder"
$rule.regexPattern:="/private/(.*)"
$rule.denyAccess:=True
$settings.rules.push($rule)

$rule:={}
$rule.comment:="Allow access to all resources placed in the 'private/allowed' folder"
$rule.regexPattern:="/private/allowed/(.*)"
$rule.denyAccess:=False
$settings.rules.push($rule)

$return:=WEB Server.start($settings)