背景
遇到一個限制域名的平台,於是使用nginx在做網站轉發,其中目標網站在訪問過程中使用了多個302、303的返回狀態,以便跳轉到指定目標(為什么限制,就是防止他的網站的鏡像)。
在查找了一段資料后,發現nginx可以proxy網站,讓其在自己的網站路徑上訪問。本文總共解決以下兩個需求:
- 訪問指定路徑時,代理指定網站
- 解決302、303狀態碼的網站
- 修改response的header
- 修改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-module
和ngx_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 '這個網頁的原始內容' '這個網頁的修改后內容';
}
總結
找了很多資料,都沒有找到符合文章,自己寫此文章記錄一下