### SERVER_REWRITE階段[](http://tengine.taobao.org/book/chapter_12.html#server-rewrite "永久鏈接至標題")
SERVER_REWRITE階段是nginx中第一個必須經歷的重要phase,請求進入此階段時已經找到對應的虛擬主機(server)配置。nginx的rewrite模塊在這個階段注冊了一個handler,rewrite模塊提供url重寫指令rewrite,變量設置指令set,以及邏輯控制指令if、break和return,用戶可以在server配置里面,組合這些指令來滿足自己的需求,而不需要另外寫一個模塊,比如將一些前綴滿足特定模式的uri重定向到一個固定的url,還可以根據請求的屬性來決定是否需要重寫或者給用戶發送特定的返回碼。rewrite提供的邏輯控制指令能夠滿足一些簡單的需求,針對一些較復雜的邏輯可能需要注冊handler通過獨立實現模塊的方式來滿足。
需要注意該階段和后面的REWRITE階段的區別,在SERVER_REWRITE階段中,請求還未被匹配到一個具體的location中。該階段執行的結果(比如改寫后的uri)會影響后面FIND_CONFIG階段的執行。另外這個階段也是內部子請求執行的第一個階段。 SERVER_REWRITE階段的checker函數是ngx_http_core_rewrite_phase:
[](http:// "點擊提交Issue,反饋你的意見...")
ngx_int_t
ngx_http_core_rewrite_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)
{
ngx_int_t rc;
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"rewrite phase: %ui", r->phase_handler);
rc = ph->handler(r);
if (rc == NGX_DECLINED) {
r->phase_handler++;
return NGX_AGAIN;
}
if (rc == NGX_DONE) {
return NGX_OK;
}
/* NGX_OK, NGX_AGAIN, NGX_ERROR, NGX_HTTP_... */
ngx_http_finalize_request(r, rc);
return NGX_OK;
}
這個函數和上面說的ngx_http_core_generic_phase函數流程基本一致,唯一的區別就是對handler返回值的處理稍有不同,比如這里對NGX_OK的處理是調用ngx_http_finalize_request結束請求,所以再強調一下,handler函數的返回值一定要根據不同phase的checker函數來設置。Nginx的rewrite模塊會掛上一個名為ngx_http_rewrite_handler的handler。
- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試