nginx做網站轉發時處理302、303返回狀態碼、修改response返回的header和網頁內容


背景

遇到一個限制域名的平台,於是使用nginx在做網站轉發,其中目標網站在訪問過程中使用了多個302、303的返回狀態,以便跳轉到指定目標(為什么限制,就是防止他的網站的鏡像)。

在查找了一段資料后,發現nginx可以proxy網站,讓其在自己的網站路徑上訪問。本文總共解決以下兩個需求:

  1. 訪問指定路徑時,代理指定網站
  2. 解決302、303狀態碼的網站
  3. 修改response的header
  4. 修改response的網頁內容

1. 訪問指定路徑跳轉到網站

使用proxy_pass指令來實現,示例如下:

# 訪問http://www.a.com/jump,就跳到指定路徑http://www.b.com/jump ,配置如下
location ~* ^/jump$ {
    proxy_pass http://www.b.com/jump;
}

2. 解決302,303的狀態碼nginx直接返回問題

在代理目標網站時,目標網站使用了302的狀態碼,這樣nginx直接返回后,網址變了,不受本網站的控制,下來就解決此問題:
使用proxy_redirect指令來實現,示例如下:

# 訪問http://www.a.com/jump,就跳到指定路徑http://www.b.com/jump ,返回302,其中要跳轉到www.c.com網站去,然后還是訪問本地網站,配置如下
location ~* ^/jump$ {
    proxy_pass http://www.b.com/jump;

    proxy_redirect http://www.c.com/ /; #請求c網站映射到當前網站的/目錄
}

以上代碼過程:訪問http://www.a.com/jump時,nginx后台會訪問http://www.b.com/jump獲取返回內容,且狀態碼時302,如果不控制的話,瀏覽器會把302中location拿出來直接訪問,而location是c網站的網址,有兩種辦法一種是修改location然后返回,一種是就是proxy_redirect方式。

3. 修改response的header

前兩點是直接路徑跳轉的,現在又有一個需求就是修改302中的location中的一些參數,那么proxy_redirect就沒有辦法了,這個時候需要使用ngx_lua模塊了,這個模塊可是用於lua語言進行控制nginx的一些邏輯。

需要安裝LuaJIT,並且下載lua-nginx-modulengx_devel_kit備用,(參考Nginx編譯安裝Lua模塊)

然后需要重新安裝nginx,其中配置時把備用的兩個東西以--add-module=/XXX/YYY/ngx_devel_kit-XXXX形式來引入進來,然后安裝等等

配置文件做如下修改,主要兩步:1.攔截302;2.使用rewirte_by_lua使用lua語言進行邏輯處理:

proxy_intercept_errors on;
recursive_error_pages on;
location ~* ^/test2$ {
    proxy_pass http://www.b.com/test2;
    error_page 302 = @error_page_302;
}

# 攔截處理器,其中rewrite_by_lua中后面的字符串就是lua模塊的代碼,`string.gsub`字符串替換,`local upstream_http_location`定義變量
# `ngx.redirect`跳轉到指定路徑
location @error_page_302 {
    rewrite_by_lua '
            local upstream_http_location = string.gsub(ngx.var.upstream_http_location, "ac.95516.com","sp.xadaoke.cn")
            ngx.redirect(upstream_http_location) ';
}

其他

如果想替換response返回的內容,可以使用ngx_http_sub_module模塊來處理,這個模塊需要在安裝nginx時配置加上--with-http_sub_module,配置中需要如下代碼:

location ~* ^/test3$ {
    proxy_pass http://www.b.com/test3;
    sub_filter '這個網頁的原始內容' '這個網頁的修改后內容';
}

總結

找了很多資料,都沒有找到符合文章,自己寫此文章記錄一下


免責聲明!

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



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