標籤:
1,問題描述
upstream datacollectbackend{ #ip_hash; server 10.234.1.211:6100 max_fails=5 fail_timeout=30s; server 10.234.1.26:7100 max_fails=5 fail_timeout=30s; } location ~* ^/OCC_DATACO_WEB/.*$ { include deny.conf; proxy_pass http://datacollectbackend; include proxy.conf; error_log logs/datacollection_error.log error; access_log logs/datacollection_access.log main; }
現在就是覺得OCC_DATACO_WEB名字太長了,想換成dt,但是工程還沒有上線,需要先做個測試,就是讓www.ds.com/dt/possystem去調用OCC_DATACO_WEB工程裡面去。
也就是說以前用www.ds.com/OCC_DATACO_WEB/possystem訪問,現在改成www.ds.com/dt/possystem訪問。但是線上工程還是OCC_DATACO_WEB,但是現在dt工程還沒有做完,處於過渡期要等新的dt完善後在移除OCC_DATACO_WEB換成dt
原blog地址:http://blog.csdn.net/mchdba/article/category/5981097 ,未經過原csdn博主mchdba允許,不得轉載。
2,用location的proxy_pass做跳轉
直接將dt的跳轉到和 OCC_DATACO_WEB一樣的proxy_pass,如下所示
location ~* ^/dt/.*$ { include deny.conf; proxy_pass http://datacollectbackend; include proxy.conf; error_log logs/dt_error.log error; access_log logs/dt__access.log main; }
然後重啟nginx,通過www.ds.com/dt/possystem訪問,結果報錯如下:
Sorry,找不到該頁面您使用的URL可能拼字有誤,該頁可能已經移動,或者它可能只是臨時離線。重新鍵入正確網址,或者返回首頁
3,用rewrite來取代location
location ~* ^/dt/.*$ { rewrite /dt/(.*) /OCC_DATACO_WEB/$1 break; }
然後重啟nginx,使用www.ds.com/dt/possystem訪問,已經生效了,成功了。
4,總結
rewrite功能就是,使用nginx提供的全域變數或自己設定的變數,結合Regex和標誌位實現url重寫以及重新導向。rewrite只能放在server{},location{},if{}中,並且只能對網域名稱後邊的除去傳遞的參數外的字串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只對/a/we/index.php重寫。文法rewrite regex replacement [flag];
如果相對網域名稱或參數字串起作用,可以使用全域變數匹配,也可以使用proxy_pass反向 Proxy。
表明看rewrite和location功能有點像,都能實現跳轉,主要區別在於rewrite是在同一網域名稱內更改擷取資源的路徑,而location是對一類路徑做控制訪問或反向 Proxy,可以proxy_pass到其他機器。很多情況下rewrite也會寫在location裡,它們的執行順序是:
執行server塊的rewrite指令
執行location匹配
執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新迴圈執行1-3,直到找到真實存在的檔案;迴圈超過10次,則返回500 Internal Server Error錯誤。
本次實踐中,是需要將dt的工程訪問都指向OCC_DATACO_WEB工程裡面去,所以需要僅僅location加proxy_pass是不夠的,需要rewrite的。
nginx中location中關於proxy_pass和rewrite的應用