最近自測後端模塊時有個業務需求須要利用WebServer(我用的是Apache)將HTTP POST請求轉發至後端C模塊,後端處理後返回2進制加密數據。http post請求的url格式爲:
http://demo-domain/myuri?param1=p1¶m2=p2
因爲myuri非php文件,故要藉助Apache的rewrite功能將其「引流」至php腳本,由後者實現真正的代理功能。
Apache的Rewrite功能由擴展模塊mod_rewrite.so實現,關於mode_rewrite的介紹,能夠參考Apache官方文檔。
不得不說,對於不熟悉Apache的新手(好比我)來講,仍是須要折騰一番的。好在最後終於搞定了,做爲筆記,記錄於此。
大致來講,要使Apache實現正常的rewrite功能並實現HTTP POST請求的代理功能,須要如下2個步驟。
1. 啓用Apache的mod_rewrite擴展
默認狀況下,Apache的擴展模塊中是包含mod_rewrite.so的,相應地,其conf/httpd.conf中也會有下面這行內容:
#LoadModule rewrite_module modules/mod_rewrite.so
mod_rewrite擴展默認未啓用,咱們只需將#註釋符去掉,啓用該擴展模塊便可。
2. 開啓RewriteEngine並配置RewriteRule
在httpd.conf文件最後部分添加下面2行內容:
RewriteEngine ON
RewriteRule ^/myuri.*$ /myproxy.php
這樣就將url的方法名爲myuri的http請求rewrite至myproxy.php腳本,由後者實現http proxy功能。
須要注意的幾點:
1)因爲個人業務需求是在服務器級作rewrite,故只需修改httpd.conf相關配置項,無需修改<Directory /> section中的AllowOverride配置,若是要用.htaccess文件實現目錄級的局部rewrtie,則爲保證rewrite功能正常使用,須要設置AllowOverride選項。
關於AllowOverwrite的說明,可參考官網文檔。關於什麼時候須要利用.htaccess實現rewrite,這篇文章有解釋,此處再也不贅述。
2)配置RewrtieRule時,這篇文章提到想要實現POST數據的rewrite,必須設置P Flag,表示force proxy。但個人測試結果代表,不設置P時http post的rewrite能夠正常work,相反,若是設置了P flag(在RewriteRule行尾明確指定RewriteRule flag爲[P]),則須要下面的第三步設置才能正常實現post的rewrite。囧。。。
3)關於RewriteRule衆多flags的含義,可參考這裏。
通過上面2步,重啓Apache後,rewrite功能就可使用了,測試代表HTTP GET/POST請求的rewrite正常,符合預期。
不過若在RewriteRule中指定[P],則post方式的rewrite還須要啓用Apache的proxy擴展,如本文第3步所述。
3. 啓用Apache的proxy擴展(是否須要該步設置視RewriteRule是否指定P flag而定)
在httpd.conf中啓用下面2個擴展模塊以實現http post的proxy功能(默認未啓用,去掉#註釋啓用便可):
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
注:經測試,上面兩個擴展缺一不可php
【參考資料】
1. Apache Module mod_rewrite
2. Apache Rewrite 規則詳解
3. Apache Rewrite 規則的常見應用
4. Windows主機:Apache啓用rewrite和.htaccess
5. Apache之AllowOverride參數詳解 html
=============== EOF ===============apache