nginx通過域名訪問項目(不接項目名稱),cookie丟失問題詳解


 最近搞了個域名,想用它直接去訪問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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM