nginx作反向代理proxy_pass,proxy_redirect的使用

今天用nginx做爲trac的反代,發現一個問題,就是登入登出跳轉的時候是白頁,看了下網頁相應內容,發現相應的location是空的。查了一下發現是隻單純用了proxy_pass,沒有使用proxy_redirect.
    假設前端url是example.com。後端server域名是csdn123.com,那麼後端server在返回refresh或location的時候,host爲csdn123.com,顯然這個信息直接返回給客戶端是不行的,須要nginx作轉換,這時能夠設置:
    proxy_redirect http://csdn123.com  /
    nginx會將host及port部分替換成自身的server_name及listen port。不過這種配置對server_name有多個值的狀況下支持很差。
咱們能夠用nginx內部變量來解決這一問題:
    proxy_redirect http://csdn123.com http://$host:$server_port
 
 
    搞定
 
    若是不設定的話,proxy_redirect默認是default屬性,官網例子是這樣介紹default的:
引用
location /one/ {
  proxy_pass       http://csdn123:port/two/;
  proxy_redirect   default;
}
 
location /one/ {
  proxy_pass       http://csdn123:port/two/;
  proxy_redirect   http://csdn123:port/two/   /one/;
}
 
 
   

    我試了下,location /{}規則時彷佛不太正常,會致使location爲空。這個有待詳細考證 css


------------------------------------------------- html


from: nginx 中文網 前端

Nginx的代理功能太完善了,咱們看看proxy_redirect參數的做用。 nginx

案例說明:
要作一個html.aslibra.com的域名處理不少網站的html內容,固然是後端的服務器了,目錄分析
html.zcom.com/img.aslibra.com/
html.zcom.com/css.aslibra.com/
訪問的域名是該目錄下的域名,那前端nginx的配置應該相似這樣: 後端

server {
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
}
} 服務器

但這樣訪問目錄時若是沒有以「/」結尾,則服務器會返回301redirect: frontend

[root@aslibra ~]# curl -I http://img.aslibra.com/www
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:28:58 GMT
Connection: keep-alive
Location: http://html.aslibra.com/img.aslibra.com/www/ curl

html.aslibra.com這個域名並不是公佈的域名,返回給客戶端是會天然產生錯誤的
Nginx能夠很好的處理這個問題: 網站

server {
server_name img.aslibra.com;
location / {
rewrite ^(.*) /$http_host$1 break;
proxy_set_header Host html.aslibra.com;
proxy_pass http://cache-89;
proxy_redirect   http://html.aslibra.com/img.aslibra.com/    /;
}
} url

加一行proxy_redirect後,正常了:

[root@aslibra ~]# curl -I http://img.aslibra.com/www
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.59
Date: Tue, 21 Jul 2009 15:23:49 GMT
Content-Type: text/html
Location: http://img.aslibra.com/www/
Connection: keep-alive
Content-Length: 185
Expires: Tue, 21 Jul 2009 16:23:49 GMT
Cache-Control: max-age=3600

就這麼樣就ok啦~
不過貌似不支持變量出如今地址裏,這個就鬱悶了,必須指定相應域名。
對於多個域名匹配的server,redirect設置不能寫做’/'了,不然會用第一個域名做爲redirect域名
能夠寫幾個匹配規則:

proxy_redirect   http://html.aslibra.com/img.aslibra.com/    http://img.aslibra.com/;
proxy_redirect   http://html.aslibra.com/css.aslibra.com/    http://css.aslibra.com/;


==================


NGINX的proxy_redirect功能比較強大,其做用是對發送給客戶端的URL進行修改。以例子說明: 

   server { 
       listen       80; 
       server_name  test.abc.com; 
       location / { 
            proxy_pass http://10.10.10.1:9080; 
       } 
   }這段配置通常狀況下都正常,但偶爾會出錯, 錯誤在什麼地方呢? 抓包發現服務器給客戶端的跳轉指令里加了端口號,如 Location: http://test.abc.com:9080/abc.html 。由於nginx服務器偵聽的是80端口,因此這樣的URL給了客戶端,必然會出錯.針對這種狀況, 加一條proxy_redirect指令: proxy_redirect http://test.abc.com:9080/ / ,把全部「http://test.abc.com:9080/」的內容替換成「/」再發給客戶端,就解決了。 

   server { 
       listen       80; 
       server_name  test.abc.com; 
       proxy_redirect http://test.abc.com:9080/ /; 
       location / { 
            proxy_pass http://10.10.10.1:9080; 
       } 
   } 


http://nginx.179401.cn/ 
聖地啊 加紅 加粗~!! 


出處:http://nginx.179401.cn/StandardHTTPModules/HTTPProxy.html 
proxy_redirect 
語法:proxy_redirect [ default|off|redirect replacement ] 
默認值:proxy_redirect default 
使用字段:http, server, location 
若是須要修改從被代理服務器傳來的應答頭中的"Location"和"Refresh"字段,能夠用這個指令設置。 
假設被代理服務器返回Location字段爲: http://localhost:8000/two/some/uri/ 
這個指令: 
proxy_redirect http://localhost:8000/two/ http://frontend/one/; 
將Location字段重寫爲http://frontend/one/some/uri/。 
在代替的字段中能夠不寫服務器名: 

proxy_redirect http://localhost:8000/two/ /; 
這樣就使用服務器的基本名稱和端口,即便它來自非80端口。 
若是使用「default」參數,將根據location和proxy_pass參數的設置來決定。 
例以下列兩個配置等效: 

location /one/ {  proxy_pass       http://upstream:port/two/;  proxy_redirect   default;} location /one/ {  proxy_pass       http://upstream:port/two/;  proxy_redirect   http://upstream:port/two/   /one/;} 
在指令中可使用一些變量: 

proxy_redirect   http://localhost:8000/    http://$host:$server_port/; 
這個指令有時能夠重複: 

proxy_redirect   default;  proxy_redirect   http://localhost:8000/    /;  proxy_redirect   http://www.example.com/   /; 
參數off將在這個字段中禁止全部的proxy_redirect指令: 

proxy_redirect   off;  proxy_redirect   default;  proxy_redirect   http://localhost:8000/    /;  proxy_redirect   http://www.example.com/   /; 
利用這個指令能夠爲被代理服務器發出的相對重定向增長主機名:

相關文章
相關標籤/搜索