最近搞了個域名,想用它直接去訪問Tomcat上部署的項目,開始一直必須加上項目名稱,經過短暫配置,成功了。
訪問一次,到達登陸頁面,結果死活登錄不進去,一直在登陸界面,原來是由於cookie丟失,現配置如下,完美解決問題:
server { listen 80; #listen somename:8080; server_name www.XXX.cn; location / { proxy_pass http://IP:8080/projectName/; proxy_cookie_path /projectName/ /; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #root html; #index index.html index.htm; } location /projectName/ { proxy_pass http://IP:8080/projectName/; proxy_cookie_path /projectName/ /; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
proxy_cookie_path /projectName/ /; 用於改變cookie路徑,解決cookie丟失問題的
在配置域名訪問應用時,常出現cookie丟失問題,原因是普通的配置cookie的路徑為(沒有經過代理的地址): http://IP:8080/projectName cookie_path:/project
但是為了不添加項目名就能訪問應用,我們把location的代理地址設置為/ ,所以要改變cookie的路徑,語法: proxy_cookie_path path
replacement
;
path就是你需要替換的路徑,replacement就是你需要替換的值
proxy_set_header Host $host;
host變量的值按照如下優先級獲得:
1. 請求行中的host.
2. 請求頭中的Host頭部.
3. 與一條請求匹配的server name.
很清楚,有三點,取優先級最高的那個。僅從字面意思上來理解,這個選擇的過程為:如果請求行中有host信息,則以請求行中的host作為host變量的
值(host與host變量不是一個東西,很拗口);如果請求行中沒有host信息,則以請求頭中的Host頭的值作為host變量的值;如果前面兩者都沒有,那
么host變量就是與該請求匹配所匹配的serve名。
proxy_set_header X-Real-IP $remote_addr; 用於獲取用戶真實IP的
詳解如下:
經過反向代理后,由於在客戶端和web服務器之間增加了中間層,因此web服務器無法直接拿到客戶端的ip,通過$remote_addr變量拿到的將是Nginx的ip地址,
但是Nginx是可以獲取用戶的真實IP的,也就是說Nginx通過$remote_addr變量時獲取的就是用戶真實IP,那么想在web服務器獲取用戶真實IP,那咱們就需要賦
值一下,如上面的配置,Nginx將用戶的真實IP賦值給X-Real-IP,然后在web端request.getAttribute("X-real-ip")獲取IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 用於獲取用戶真實IP的
另附上獲取IP的工具
import java.io.IOException; import javax.servlet.http.HttpServletRequest; /** * 常用獲取客戶端信息的工具 * */ public final class NetworkUtil { /** * 獲取請求主機IP地址,如果通過代理進來,則透過防火牆獲取真實IP地址; * * @param request * @return * @throws IOException */ public final static String getIpAddress(HttpServletRequest request) throws IOException { // 獲取請求主機IP地址,如果通過代理進來,則透過防火牆獲取真實IP地址 String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } else if (ip.length() > 15) { String[] ips = ip.split(","); for (int index = 0; index < ips.length; index++) { String strIp = (String) ips[index]; if (!("unknown".equalsIgnoreCase(strIp))) { ip = strIp; break; } } } return ip; } }