Nginx SSL+tomcat叢集,request.getScheme() 取到https正確的協議詳解
歡迎掃碼加入Java高知群交流
公司之前用的是http,但是出於蘋果app稽核和伺服器安全性問題,要改為https,我們公司用的是沃通的ssl,按照沃通的官方文件提供的步驟完成伺服器的配置。 架構上使用了 Nginx +tomcat 叢集, 且nginx下配置了SSL,tomcat 沒有配置SSL,專案使用https協議。
配置成功後明明是https url請求,發現 log裡面,tomcat獲取scheme的時候,一直是http,而不是想像中的https
0415 16:01:10 INFO (PaymentInterceptor.java:44) preHandle() - requestStringForLog: { "request.getRequestURL():": "http://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6", "request.getMethod:": "GET", "_parameterMap": { "id": ["212"], "s": ["a84485e0985afe97fffd7fd7741c93851d83a4f6"] } }
request.getRequestURL() 輸出出來的 一直是
http://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6
但是瀏覽器中的URL卻是
https://m.xxx.com/payment/paymentChannel?id=212&s=a84485e0985afe97fffd7fd7741c93851d83a4f6
下面我們進一步研究發現,java API上寫得很清楚:
getRequestURL():
也就是說, getRequestURL() 輸出的是不帶query string的路經(含協議,埠,server path等資訊).Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.
並且還發現
request.getScheme() //總是 http,而不是實際的http或https request.isSecure() //總是false(因為總是http) request.getRemoteAddr() //總是 nginx 請求的 IP,而不是使用者的IP request.getRequestURL() //總是 nginx 請求的URL 而不是使用者實際請求的 URL response.sendRedirect( 相對url ) //總是重定向到 http 上 (因為認為當前是 http 請求)
那麼解決方案有沒有呢,答案是肯定的,其實解決方法非常的簡單,只需要分別配置一下 Nginx 和 Tomcat 就好了,而不用從程式程式碼上修改。
1.配置nginx的轉發項,配置檔案為proxy.conf,內容如下:
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
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-Proto $scheme;
其中的proxy_set_header X-Forwarded-Proto $scheme;起到了關鍵性的作用。
2.配置tomcat,配置檔案為server.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server-xml [
<!ENTITY vhost-localhost SYSTEM "file:///usr/local/tomcat-interface/conf/vhost/localhost.xml">
]>
<Server port="8006" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="1000"
minSpareThreads="20"
acceptCount="1000"
debug="0"
disableUploadTimeout="true"
useBodyEncodingForURI="true"
enableLookups="false"
URIEncoding="UTF-8" />
<Engine name="Catalina" defaultHost="localhost">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
&vhost-localhost;
</Engine>
</Service>
</Server>
其中關鍵的語句為:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
配置雙方的 X-Forwarded-Proto 就是為了正確地識別實際使用者發出的協議是 http 還是 https。
配置完成之後以下的請求訪問
request.getScheme() 、request.isSecure() 、request.getRemoteAddr()、request.getRequestURL() 、response.sendRedirect( 相對url )
就都變為正確的結果了,就像使用者在直接訪問 Tomcat 一樣。
歡迎掃碼加入Java高知群交流
相關推薦
Nginx SSL+tomcat叢集,request.getScheme() 取到https正確的協議詳解
歡迎掃碼加入Java高知群交流 公司之前用的是http,但是出於蘋果app稽核和伺服器安全性問題,要改為https,我們公司用的是沃通的ssl,按照沃通的官方文件提供的步驟完成伺服器的配置。 架構上使用了 Nginx +tomcat 叢集, 且nginx下配置了S
Fiddler抓取https設置詳解
谷歌瀏覽器 rom mini make admin 忽略 導入 fiddler抓包 .cn 很多使用fiddler抓包,對於http來說不需太多糾結,隨便設置下就能用,但是抓取https就死活抓不了, 出現諸如以下問題: creation of the root certi
Fiddler抓取https設置詳解(圖文)
生成器 oot tro tun 忽略 圖文 htm .com tps 本文主要說明了自己在設置fiddler抓取https過程中所遇到的問題及解決步驟,特別是fiddler在設置證書的環節遇到的各種奇葩問題,特此分享! 聲明:本文為原創文章,轉載請註明來源:https://
(5)HTTPS加密協議詳解
HTTPS加密協議詳解 本文大部分內容來自沃通技術 一、HTTPS基礎知識 HTTPS (Secure Hypertext Transfer Protocol)安全超文字傳輸協議,是一個安全通訊通道,它基於HTTP開發用於在客戶計算機和伺服器之間交換資訊。它使用安全套接字層(
HTTPS加密協議詳解
簡介 HTTPS (Secure Hypertext Transfer Protocol)安全超文字傳輸協議,是一個安全通訊通道,它基於HTTP開發用於在客戶計算機和伺服器之間交換資訊。它使用安全套接字層(SSL)進行資訊交換,簡單來說它是HTTP的安全版,是
Nginx SSL+tomcat集群,request.getScheme() 取到https正確的協議
port nor tom com () not request 一個 header 轉自:http://feitianbenyue.iteye.com/blog/2056357 最近在做一個項目, 架構上使用了 Nginx +tomcat 集群, 且nginx下配置了
Nginx SSL+tomcat集群,取不到https正確協議
分享 安裝目錄 remote 瀏覽器 架構 解決方案 name head 文件 最近在做一個項目, 用到企業微信,架構上使用了 Nginx +tomcat 集群, 且nginx下配置了SSL,tomcat no SSL,項目使用https協議,但是在調試微信菜單的相關功能時
利用nginx搭建tomcat叢集
一、安裝tomcat tomcat安裝不做介紹,在每臺伺服器上都安裝tomcat即可! 二、安裝nginx yum安裝nginx 三、修改nginx的配置檔案 yum安裝後,nginx的配置檔案在/etc/nginx下面 可以執行指令: vim /etc/nginx/
Nginx SSL證書部署,開啟全站HTTPS訪問(多域名)
我們都知道,現在已經進入了HTTPS時代,連搜尋引擎都會專門為HTTPS網站的索引進行加權。HTTPS的主要特點是更安全,雖然有可能會讓我們的訪問變得稍慢一些,但是保證安全以及與時俱進聽起來很有吸引力。 下面我們就以從騰訊雲申請的免費SSL證書為例,演示下如何通過nginx為我們的網
Nginx 與 Tomcat : 413 Request Entity Too Large(請求實體太大)
最近開發時遇到了上傳失敗的情況 , 看日誌居然顯示post請求實體過大. 然後查了查資料 , 修改代理伺服器Nginx 和 伺服器Tomcat的相關配置 **1.**Nginx 作為反向代理伺服器 , nginx最先收到client請求 ,一定會有一些限制
windows下通過nginx實現tomcat叢集負載均衡(入門)
一、目標 Windows下,下載安裝nginx Nginx常用命令 Nginx負載均衡兩個tomcat Nginx配置多個負載均衡服務 二、下載安裝nginx 下載地址http://nginx.org/en/download.html 版本nginx-1.
linxu下部署nginx的SSL證書(HTTPS)依賴模組與使用nginx.conf配置https協議詳解
一:開始Nginx的SSL模組1.1 Nginx如果未開啟SSL模組,配置Https時提示錯誤1nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/n
ubuntu nginx+redis+tomcat叢集配置
一.環境介紹 Linux: ubuntu16.04 64位系統 Nginx: 版本1.13.0 Tomcat: 版本7.0 Redis: 3.0.4 使用nginx做負載均衡, 2臺tomca
Nginx和Tomcat叢集部署
目錄 1.安裝規劃 2.系統概述 2.1 硬體 2.2軟體 2.3安裝順序 3.軟體獲取 3.1Tomcat下載 3.2Nginx下載 4.Tomcat安裝 4.1JAVA環境配置 4.2 Tomcat安裝 4.2.1 Tomcat埠修改 4.2.2 啟動tomcat 5
HTTPS協議詳解(二):TLS/SSL工作原理
-c 基本 公鑰加密 工作方式 通信 使用 sha2 公開 原理 HTTPS協議的主要功能基本都依賴於TLS/SSL協議,本節分析TLS/SSL協議工作原理。 TLS/SSL的功能實現主要依賴於三類基本算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實
HTTPS協議詳解(四):TLS/SSL握手過程
其它 對數 hello 減少 受保護 改版 text gin 組裝 1、握手與密鑰協商過程 基於RSA握手和密鑰交換的客戶端驗證服務器為示例詳解TLS/SSL握手過程 再看一張手繪時序圖 (1).client_hello 客戶端發起請求,以明文傳輸請求信息,包
HTTPS協議詳解(三):PKI 體系
客戶 判斷 節點 無法 三方 證書無效 進行 證書 roo 1、RSA身份驗證的隱患 身份驗證和密鑰協商是TLS的基礎功能,要求的前提是合法的服務器掌握著對應的私鑰。但RSA算法無法確保服務器身份的合法性,因為公鑰並不包含服務器的信息,存在安全隱患: 客戶端C和
FastDFS分布式文件系統&Nginx負載均衡最小環境安裝配置[超級詳解]
nbsp strong figure 分割 不能訪問 org 事先 zlib 編輯 1、背景 FastDFS 是一款開源的、分布式文件系統(Distributed File System),由淘寶開發平臺部資深架構師余慶開發。該開源項目的主頁是 http://code.go
幹貨 | Tomcat 連接數與線程池詳解
非阻塞 取出 http1 pri num 應用層 close wait 支持 前言 在使用tomcat時,經常會遇到連接數、線程數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的連接器(Connector)。 在前面的文章 詳解Tomcat配置文件server.
我的網站HTTPS改造全程詳解
一直用的是360瀏覽器管理自己的網站,有一次在朋友電腦用谷歌瀏覽器檢視自己的網站,發現谷歌瀏覽器在網站位址列前面標註不安全,還以為網站出啥漏洞了,後來發現是虛驚一場,原因是谷歌對未安裝SSL證書的網站都提示安全風險,後來查了一大堆資料,發現很多關於HTTP和HTTPS的介紹,大致就是下面的幾種說法: &nb