作者:Carlo
背景:最近很多小夥伴使用Nginx代理iServer,将HTTP協定成HTTPS協定,但是可能會出現以下幾種情況:
(1)
圖檔、js、css等靜态資源無法加載
(2)
代理後頁面跳轉回HTTP協定
(3)
代理後通路服務管理界面提示“該使用者無查詢服務通路統計資訊權限”
針對上述情況應該如何解決問題呢?其實這些問題都是因為代理後丢失https協定,導緻請求變成http,下面我将詳細講解如何避免這個問題。
本文采用的OpenSSL去生成公鑰和私鑰。生成密鑰的方式可以參考部落格(
Nginx代理iServer的HTTP協定成HTTPS)介紹得比較詳細,在此就不做多餘的說明了。
首先我們需要引入一個Nginx知識:
sub_filter子產品
為Nginx官方自帶的子產品,功能為替換掉傳回給用戶端資料的指定内容。需要使用該功能時隻需要在編譯時添加對該子產品的支援,便會編譯到Nginx的核心。本需介紹的方式就是利用sub_filter将HTTP替換成HTTPS。
sub_filter文法包括:
sub_filter_types
:*; 需要替換的類型,如text/htnl text/plain application/ javascript等,以空格分隔,預設隻查找文本型檔案;
sub_filter_once
: on/off; 是否隻替換一次,on是開啟此功能,off是關閉——預設值是on;
sub_filter
: xxx1 xxx2; 前面的參數為原始内容,後面的參數為替換後的内容。
Nginx配置說明:
# https配置
server {
listen 8000 ssl;
server_name ip;
ssl_certificate nginxRSAcert.pem;
ssl_certificate_key nginxRSAcert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://ip:8090;
proxy_set_body $request_body;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host:8000;
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://ip:8000/iserver' 'https://ip:8000/iserver';
}
}
結果驗證:
(1)
圖檔、js、css靜态資源正常加載
(2)
代理後頁面跳轉回均為HTTPS協定
(3)
代理後通路服務管理界面正常