在用Apache做負載平衡器的時候,與應用伺服器(Tomcat或JBoss)之間是通過AJP協議來通訊的。比如在JBoss裡是這樣配置的:
<Service name="jboss.web"> <!-- A HTTP/1.1 Connector on port 8080 --> <Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" /> <!-- A AJP 1.3 Connector on port 8009 --> <Connector protocol="AJP/1.3" port="8009" address="${jboss.bind.address}" redirectPort="8443" /> ......</Service>
注意,這兩個節點(HTTP和AJP)是沒有指定編碼格式的,而我們的頁面(JSP或PHP等)通常都是UTF-8編碼的,比如一個JSP頁面:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
這樣,如果連結中中有中文(比如將中文作為查詢字串的參數),這段中文就會變為亂碼,導致應用程式出錯。
因此,如果是直接通過應用伺服器訪問,則要在HTTP的Connector節點中設定編碼格式:
<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
如果是通過Apache訪問,則要在AJP的Connector節點中設定編碼格式:
<Connector protocol="AJP/1.3" port="8009" address="${jboss.bind.address}" redirectPort="8443" URIEncoding="UTF-8" />