nginx轉(zhuǎn)發(fā)后卓箫,CAS拿不到正確端口的問題

訪問路徑:用戶 -> nginx -> tomcat
在直接訪問tomcat時(shí)沒有問題埋涧,但經(jīng)過nginx后cas無法拿到端口碘勉,導(dǎo)致拿到ticket后跳轉(zhuǎn)錯(cuò)誤巷挥。

http://portal.example.com/portalcas/login;jsessionid=XXXX?service=http://example.com:8080/cas
302 http://example.com:8080/cas?ticket=ST-1234-XXXXXX-portal.example.com
302 http://example.com/

查看cas中跳轉(zhuǎn)的邏輯:

org.apache.shiro.web.filter.authc.AuthenticationFilter
    protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception {
        WebUtils.redirectToSavedRequest(request, response, getSuccessUrl());
    }
org.apache.shiro.web.util.WebUtils
    public static void issueRedirect(ServletRequest request, ServletResponse response, String url, Map queryParams, boolean contextRelative, boolean http10Compatible) throws IOException {
        RedirectView view = new RedirectView(url, contextRelative, http10Compatible);
        view.renderMergedOutputModel(queryParams, toHttp(request), toHttp(response));
    }
org.apache.shiro.web.servlet.ShiroHttpServletResponse
    public String encodeRedirectURL(String url) {
        if (isEncodeable(toAbsolute(url))) {
            return toEncoded(url, request.getSession().getId());
        } else {
            return url;
        }
    }
    private String toAbsolute(String location) {
        boolean leadingSlash = location.startsWith("/");

        if (leadingSlash || !hasScheme(location)) {

            StringBuilder buf = new StringBuilder();

            String scheme = request.getScheme();
            String name = request.getServerName();
            int port = request.getServerPort();

            try {
                buf.append(scheme).append("://").append(name);
                if ((scheme.equals("http") && port != 80)
                        || (scheme.equals("https") && port != 443)) {
                    buf.append(':').append(port);
                }
                if (!leadingSlash) {
                    String relativePath = request.getRequestURI();
                    int pos = relativePath.lastIndexOf('/');
                    relativePath = relativePath.substring(0, pos);

                    String encodedURI = URLEncoder.encode(relativePath, getCharacterEncoding());
                    buf.append(encodedURI).append('/');
                }
                buf.append(location);
            } catch (IOException e) {
                IllegalArgumentException iae = new IllegalArgumentException(location);
                iae.initCause(e);
                throw iae;
            }

            return buf.toString();

        } else {
            return location;
        }
    }

其中的request.getServerPort();是獲取請求頭中的端口,如果nginx轉(zhuǎn)發(fā)時(shí)沒有帶上就會是默認(rèn)的80

方案一

不推薦
nginx中將proxy_set_header Host $host;改為proxy_set_header Host $host:$server_port;proxy_set_header Host $http_host;

方案二

nginx中添加如下頭:

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_set_header X-Forwarded-Host $server_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;

如果是springboot集成的tomcat验靡,在application.yml中如下配置:

server:
  tomcat:
    remoteip:
      protocol-header: X-Forwarded-Proto
      remote-ip-header: X-Forwarded-For
      protocol-header-https-value: https

如果直接配置tomcat的xml:

<Engine>
    <Valve className="org.apache.catalina.valves.RemoteIpValve" 
    remoteIpHeader="X-Forwarded-For" 
    protocolHeader="X-Forwarded-Proto" 
    protocolHeaderHttpsValue="https"/>
</Engine >

當(dāng)開啟了X-Forwarded-Proto時(shí)倍宾,會去獲取X-Forwarded-Port的值,獲取不到就會使用默認(rèn)的80胜嗓、443.

參考:
https://serverfault.com/questions/363159/nginx-proxy-pass-redirects-ignore-port
http://thomaslau.xyz/2019/10/28/2019-10-28-nginx_springsecurity_cas_error/
https://blog.csdn.net/goldenfish1919/article/details/78815192
https://blog.csdn.net/heavenick/article/details/51924774

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末高职,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辞州,更是在濱河造成了極大的恐慌怔锌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件变过,死亡現(xiàn)場離奇詭異埃元,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)媚狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門岛杀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崭孤,你說我怎么就攤上這事类嗤『Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵土浸,是天一觀的道長罪针。 經(jīng)常有香客問我,道長黄伊,這世上最難降的妖魔是什么泪酱? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮还最,結(jié)果婚禮上墓阀,老公的妹妹穿的比我還像新娘。我一直安慰自己拓轻,他們只是感情好斯撮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扶叉,像睡著了一般勿锅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枣氧,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天溢十,我揣著相機(jī)與錄音,去河邊找鬼达吞。 笑死张弛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酪劫。 我是一名探鬼主播吞鸭,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼覆糟!你這毒婦竟也來了刻剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搪桂,失蹤者是張志新(化名)和其女友劉穎透敌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踢械,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酗电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了内列。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵术。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖话瞧,靈堂內(nèi)的尸體忽然破棺而出嫩与,到底是詐尸還是另有隱情寝姿,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布划滋,位于F島的核電站饵筑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏处坪。R本人自食惡果不足惜根资,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望同窘。 院中可真熱鬧玄帕,春花似錦、人聲如沸想邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丧没。三九已至鹰椒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呕童,已是汗流浹背吹零。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拉庵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓套蒂,卻偏偏與公主長得像钞支,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子操刀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容