Apache Module

Tomohiro Ikebe
Tomohiro Ikebe執行役員 at NHN Japan 株式会社
Apache モジュール入門 ( 株 ) ライブドア 池邉智洋
Apache モジュールとは? ,[object Object],[object Object],[object Object]
Apache の構造 Apache Core Apache API Apache モジュール
Apache モジュールの利点、欠点 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用箇所 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Apache のライフサイクル ,[object Object],[object Object],クライアントの接続 リクエスト読み込み URI 変換 アクセス制御 認証 微調整 (fixup) コンテンツ出力 ロギング インプットフィルタ アウトプットフィルタ
APR ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
メモリ管理 ,[object Object],[object Object],[object Object],my_module_conf *conf =  apr_palloc(p,sizeof(my_module_conf)); 領域の確保
文字列操作 ,[object Object],[object Object],char *str = apr_pstrdup(p, src); 文字列のコピー char *str = apr_pstrcat(p, str1, str2, NULL); 文字列の連結 char *str = apr_psprintf(p, “%d”, n); 文字列フォーマット
動的配列 ,[object Object],[object Object],apr_array_header_t *arr =  apr_array_make(p, 10, sizeof(char *)); 配列の生成 *(const char **)apr_array_push(arr) = val; 値の追加 arr->nelts; 要素数 char **elts = arr->elts; 配列実体
テーブル ,[object Object],[object Object],[object Object],apr_table_t *tbl= apr_table_make(p, 12); テーブルの作成 apr_table_set(tbl, key, val); 値のセット char *val = apr_table_get(tbl, key); 値の取得 apr_table_unset(tbl, key); 値の削除
apxs ,[object Object],[object Object],% apxs –g –n <module_name> 雛形の作成 # apxs –i –a -c mod_<module_name>.c コンパイルしてインストール
雛形の作成 % apxs -g -n hello Creating [DIR]  hello Creating [FILE] hello/Makefile Creating [FILE] hello/modules.mk Creating [FILE] hello/mod_hello.c Creating [FILE] hello/.deps # cd hello/ # apxs –i –a –c mod_hello.c # /usr/local/apache2/bin/apachectl stop # /usr/local/apache2/bin/apachectl start <Location /hello> SetHandler hello </Location> httpd.conf
確認
ソースコード 1 #include &quot;httpd.h&quot; #include &quot;http_config.h&quot; #include &quot;http_protocol.h&quot; #include &quot;ap_config.h&quot; /*  コンテントハンドラ  */ static int hello_handler(request_rec *r) { if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;;  if (!r->header_only) ap_rputs(&quot;The sample page from mod_hello.c&quot;, r); return OK; }
request_rec  構造体 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
request_rec  構造体 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Apache API ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ハンドラの返り値 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールの連鎖 ,[object Object],[object Object],mod_foo foo_handler() mod_bar bar_handler() default default_handler()
ソースコード 2 static void hello_register_hooks(apr_pool_t *p) { ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF,  NULL,  /* create per-dir  config */ NULL,  /* merge  per-dir  config */ NULL,  /* create per-server config */ NULL,  /* merge  per-server config */ NULL,  /* config file commands */ hello_register_hooks  /* register hooks */ };
ハンドラの登録 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールの定義 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
設定値の使用 ,[object Object],<Location /hello> SetHandler hello HelloMessage “Hello livedoor!” </Location> httpd.conf
設定値を格納する構造体 typedef struct { char *msg; } hello_cfg; 構造体の宣言 static void *create_hello_cfg(apr_pool_t *p, char *dir) { hello_cfg *cfg =  apr_palloc(p, sizeof(hello_cfg)); cfg->msg = &quot;Hello World!&quot;; return (void *)cfg; } 初期化
ディレクティブの定義 static const char *cmd_set_message(cmd_parms *cmd, void *c, const char *v) { hello_cfg *cfg = (hello_cfg *)c; cfg->msg = apr_pstrdup(cmd->pool, v); return NULL; } static const command_rec hello_cmds[] = { AP_INIT_TAKE1(&quot;HelloMessage&quot;,  cmd_set_message,  NULL, ACCESS_CONF,  &quot;Set mod_hello message.&quot;), {NULL} }; HelloMessage  ディレクティブを定義
ディレクティブ名の登録 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ディレクティブの設定場所 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールに登録 module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF,  hello_create_cfg,  NULL,  NULL,  NULL,  hello_cmds,  hello_register_hooks  }; モジュール定義を変更
設定値の利用 static int hello_handler(request_rec *r) { hello_cfg *cfg =  ap_get_module_config(r->per_dir_config, &hello_module); if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;;  if (!r->header_only) ap_rprintf(r, &quot;%s&quot;, cfg->msg); return OK; } ap_get_module_config  で設定値を参照
さらに複雑なモジュールを書くために ,[object Object],[object Object],[object Object],[object Object]
おしまい
1 of 32

Recommended

The Integration of Laravel with Swoole by
The Integration of Laravel with SwooleThe Integration of Laravel with Swoole
The Integration of Laravel with SwooleAlbert Chen
3.5K views57 slides
SPAのルーティングの話 by
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話ushiboy
22.4K views35 slides
社内Java8勉強会 ラムダ式とストリームAPI by
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
54.9K views54 slides
OpenID Connect入門 by
OpenID Connect入門OpenID Connect入門
OpenID Connect入門土岐 孝平
2K views65 slides
今日からできる!簡単 .NET 高速化 Tips by
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
35.1K views53 slides
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup by
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
14.5K views48 slides

More Related Content

What's hot

Spring Boot by
Spring BootSpring Boot
Spring BootJiayun Zhou
2.5K views110 slides
Static Web AppsとBlazor WebAssemblyのすすめ by
Static Web AppsとBlazor  WebAssemblyのすすめStatic Web AppsとBlazor  WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめTomomitsuKusaba
517 views21 slides
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話 by
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話Daichi Koike
2.5K views54 slides
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 by
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
58.9K views76 slides
10分でわかるOpenAPI V3 by
10分でわかるOpenAPI V310分でわかるOpenAPI V3
10分でわかるOpenAPI V3Kazuchika Sekiya
4.2K views9 slides
Spring Security 5.0 解剖速報 by
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Takuya Iwatsuka
15.7K views72 slides

What's hot(20)

Static Web AppsとBlazor WebAssemblyのすすめ by TomomitsuKusaba
Static Web AppsとBlazor  WebAssemblyのすすめStatic Web AppsとBlazor  WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめ
TomomitsuKusaba517 views
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話 by Daichi Koike
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike2.5K views
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 by Hiroshi Ito
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito58.9K views
Spring Security 5.0 解剖速報 by Takuya Iwatsuka
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
Takuya Iwatsuka15.7K views
Node.js Express by Eyal Vardi
Node.js  ExpressNode.js  Express
Node.js Express
Eyal Vardi4.8K views
Technologies sur angular.pptx by IdrissaDembl
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptx
IdrissaDembl117 views
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~ by infinite_loop
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop67.3K views
PHP-FPM の子プロセス制御方法と設定をおさらいしよう by Shohei Okada
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada1.8K views
クラウド環境下におけるAPIリトライ設計 by Kouji YAMADA
クラウド環境下におけるAPIリトライ設計クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
Kouji YAMADA4K views
Elixirと他言語の比較的紹介 ver.2 by Tsunenori Oohara
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
Tsunenori Oohara9K views
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!― by shinjiigarashi
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi10.1K views
雑なMySQLパフォーマンスチューニング by yoku0825
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
yoku082555K views
asm.jsとWebAssemblyって実際なんなの? by Yosuke Onoue
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
Yosuke Onoue15.2K views
webエンジニアのためのはじめてのredis by nasa9084
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
nasa9084 8.3K views
MySQL負荷分散の方法 by 佐久本正太
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
佐久本正太26.8K views
Webアプリでパスワード保護はどこまでやればいいか by Hiroshi Tokumaru
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
Hiroshi Tokumaru19.7K views

Similar to Apache Module

ネットワークエンジニアのための Puppet / Chef by
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
8.1K views57 slides
ASP.NET MVC 1.0 by
ASP.NET MVC 1.0ASP.NET MVC 1.0
ASP.NET MVC 1.0Shinpei Ohtani
19K views43 slides
WTM53 phpフレームワーク いまさらcodeigniter by
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
3.9K views44 slides
Cloudstack user group meeting in osaka by
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osakaNaotaka Jay HOTTA
949 views39 slides
hbstudy37 doc by
hbstudy37 dochbstudy37 doc
hbstudy37 docFujishiro Takuya
2.2K views16 slides
densan2014-late01 by
densan2014-late01densan2014-late01
densan2014-late01Takenori Nakagawa
537 views32 slides

Similar to Apache Module(20)

ネットワークエンジニアのための Puppet / Chef by npsg
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
npsg8.1K views
WTM53 phpフレームワーク いまさらcodeigniter by Masanori Oobayashi
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi3.9K views
AWSマイスターシリーズReloaded(AWS Beanstalk) by Akio Katayama
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)
Akio Katayama2.5K views
Hive undocumented feature by tamtam180
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180 7.9K views
Aizu.LT::Tokyo #4 by Taku Unno
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4
Taku Unno989 views
Webサーバの基礎知識【編集済み】 by Kikunaga Taishi
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi3K views
ヒカルのGo 資料 Webアプリケーションの作り方 by Yosuke Furukawa
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa25.9K views
【学習メモ#1st】12ステップで作る組込みOS自作入門 by sandai
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai10K views
Railsの運用について by Yuuki Namikawa
Railsの運用についてRailsの運用について
Railsの運用について
Yuuki Namikawa1.6K views
Ansibleで始めるinfraTDD(初級編) by 佐久本正太
Ansibleで始めるinfraTDD(初級編)Ansibleで始めるinfraTDD(初級編)
Ansibleで始めるinfraTDD(初級編)
佐久本正太980 views

Recently uploaded

Web3 Career_クレデン資料 .pdf by
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdfnanamatsuo
14 views9 slides
SNMPセキュリティ超入門 by
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
188 views15 slides
The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
50 views29 slides
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化Knowledge & Experience
12 views34 slides
JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides
Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
76 views41 slides

Recently uploaded(11)

Web3 Career_クレデン資料 .pdf by nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo14 views
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda188 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.50 views
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by Knowledge & Experience
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka76 views
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之94 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4184 views
01Booster Studio ご紹介資料 by ssusere7a2172
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料
ssusere7a2172345 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...

Apache Module

  • 1. Apache モジュール入門 ( 株 ) ライブドア 池邉智洋
  • 2.
  • 3. Apache の構造 Apache Core Apache API Apache モジュール
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13. 雛形の作成 % apxs -g -n hello Creating [DIR] hello Creating [FILE] hello/Makefile Creating [FILE] hello/modules.mk Creating [FILE] hello/mod_hello.c Creating [FILE] hello/.deps # cd hello/ # apxs –i –a –c mod_hello.c # /usr/local/apache2/bin/apachectl stop # /usr/local/apache2/bin/apachectl start <Location /hello> SetHandler hello </Location> httpd.conf
  • 15. ソースコード 1 #include &quot;httpd.h&quot; #include &quot;http_config.h&quot; #include &quot;http_protocol.h&quot; #include &quot;ap_config.h&quot; /* コンテントハンドラ */ static int hello_handler(request_rec *r) { if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;; if (!r->header_only) ap_rputs(&quot;The sample page from mod_hello.c&quot;, r); return OK; }
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. ソースコード 2 static void hello_register_hooks(apr_pool_t *p) { ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-dir config */ NULL, /* merge per-dir config */ NULL, /* create per-server config */ NULL, /* merge per-server config */ NULL, /* config file commands */ hello_register_hooks /* register hooks */ };
  • 22.
  • 23.
  • 24.
  • 25. 設定値を格納する構造体 typedef struct { char *msg; } hello_cfg; 構造体の宣言 static void *create_hello_cfg(apr_pool_t *p, char *dir) { hello_cfg *cfg = apr_palloc(p, sizeof(hello_cfg)); cfg->msg = &quot;Hello World!&quot;; return (void *)cfg; } 初期化
  • 26. ディレクティブの定義 static const char *cmd_set_message(cmd_parms *cmd, void *c, const char *v) { hello_cfg *cfg = (hello_cfg *)c; cfg->msg = apr_pstrdup(cmd->pool, v); return NULL; } static const command_rec hello_cmds[] = { AP_INIT_TAKE1(&quot;HelloMessage&quot;, cmd_set_message, NULL, ACCESS_CONF, &quot;Set mod_hello message.&quot;), {NULL} }; HelloMessage ディレクティブを定義
  • 27.
  • 28.
  • 29. モジュールに登録 module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF, hello_create_cfg, NULL, NULL, NULL, hello_cmds, hello_register_hooks }; モジュール定義を変更
  • 30. 設定値の利用 static int hello_handler(request_rec *r) { hello_cfg *cfg = ap_get_module_config(r->per_dir_config, &hello_module); if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;; if (!r->header_only) ap_rprintf(r, &quot;%s&quot;, cfg->msg); return OK; } ap_get_module_config で設定値を参照
  • 31.