apache 模組開發之輸出過濾器

2021-08-30 01:30:33 字數 3502 閱讀 1245

前面寫了apache模組開發之hellloworld ,那個例子是乙個簡單的內容生成器。現在我們來講乙個過濾器的實現。過濾器是apache中乙個非常精妙的設計,apache自帶的很多模組都是通過過濾器來實現。

對於過濾器,有輸入過濾器與輸出過濾器兩種。

對於輸入過濾器,就是在內容生成器之前執行,而輸出過濾器則在內容生成器之後。可以有下面的順序:

http請求-》輸入過濾器-》內容生成-》輸出過濾器-》使用者

所有的請求都會經過我們的過濾器,所以我們可以對這些進行操作,比如統計流量,壓縮等等。

下面我們講乙個例子,這個例子是apache自帶的乙個demo,它的功能是把頁面中所有的小寫字母變成大寫字母。

從上面的過濾器流程中我們可以找到,只要我們在輸出過濾器中掛乙個鉤子,然後將所有的字元變成大寫就ok了。

**如下:

首先所有程式的入口還是case_filter_module這個變數,它和之前的helloworld多了幾個選項,其中casefiltercreateserverconfig這是乙個伺服器初始化函式,這個初始化會在apache啟動的時候執行。

我們來看下具體的實現:

static void *casefiltercreateserverconfig(apr_pool_t *p,server_rec *s)

這裡我們需要講一下在apache中申請記憶體空間和普通的c語言的malloc有所區別,apache的申請空間都是向池申請,然後在這個池消失的時候就自動的釋放我們的空間。其效率也要高於我們普通c語言malloc的堆空間分配的。

具體語法:

casefilterconfig *pconfig=apr_pcalloc(p,sizeof *pconfig);

這裡就是向p這個池申請了空間,這個變數初始化以後,它的生命週期是等同於整個httpd程序的。所以在我們後面的程式中都可以呼叫。

case_filter_module這個變數還有casefiltercmds這個變數,這是乙個配置命令,也就是說當我們想把一些引數通過配置httpd.conf來傳入apache的時候,我們就通過這個函式指標。

它的結構為:

static const command_rec casefiltercmds =

};

變數第乙個引數為我們配置的選項,也就是我們的key,第二個引數是這個配置命令將執行的函式,我們就是通過這個函式來傳遞我們的配置的。例如本例子我們需要在httpd.conf中加入casefilter on這個命令,我們也可以看到casefilterenable的實現為:

static const char *casefilterenable(cmd_parms *cmd, void *dummy, int arg)

case_filter_module最後乙個引數就是我們的註冊函式,具體實現如下:

static void casefilterregisterhooks(apr_pool_t *p)

ap_hook_insert_filter 就是通過casefilterinsertfilter來講我們的過濾器加入到apache過濾鏈中,然後就是ap_register_output_filter這個函式將我們的過濾器模組註冊起來。

當我們需要輸出乙個頁面的時候,就會觸發ap_register_output_filter中低二個引數,這個引數為我們的處理函式指標,也就是我們所有的操作都是可以在這裡搞定。對於這裡,我們把所有的小寫字母轉化為大寫字母,當然我們可以做更多的事情。

最後我們在我們的httpd.conf中加入

loadmodule******//載入我們的模組

再加上我們的配置命令

casefilter on //開啟我們的過濾模組,我們也可以加入很多類似的配置。

編譯我們的模組,重新啟動apache,在看看我們的apache中所有的頁面中的小寫變成了大寫。

最後還需要講一點的時候,上面用的很多函式和標準c是有區別的,都是呼叫的apr的庫。所以我們還要去熟悉下這裡的函式,總體來說和標準c是差不多的,只是做了一些優化。

Apache 模組開發

一 目的 寫乙個apache2.0的mod模組,讀取配置,並對所有字尾為.hello的請求進行處理。二 步驟 建立乙個mod hello.c檔案 1 定義乙個模組。2 定義介面。module ap module declare data hello module 說明 其中create modhel...

Apache模組開發

參考 第一步使用採用apache只帶的工具apxs產生乙個模板helloword模組 apxs g n hello 這樣就會在當前目錄產生乙個hello資料夾 進入hello資料夾,修改mod hello.c檔案 裡面有hello handler函式,即為對請求進行處理的函式。可以再這裡修改處理請求...

apache模組開發例項

該例子是在 usr local apache2 logs error log檔案中寫入一條訪問記錄 apache2 mod tut1 a request was made.執行下面指令 在當前目錄下生成apache2 modules目錄 進入apache2 modules自目錄tut1 執行下面指令...