Nginx 重定向
> 重定向是通過 Response 狀態 301 和 302 完成的, 301 狀態是永久重定向, 在用戶瀏覽器中長期保存, 甚至不經過服務器確認, 這種狀態最好少用 > 302 狀態稱為 Found, 告訴瀏覽器當前訪問的 URL 臨時移動到另一個 Location 下了, 瀏覽器應該重新訪問這個 Location. > 另外Nginx有內部重定向, 注意區分
配置基於 location 的虛擬機
現在有一個 JSP 項目 Shop, 啟動在 http://127.0.0.1:8080, 項目結構如下:
要求訪問 http://abc.com/a/ 下的內容時時轉發到該項目, Nginx 配置如下:
首先, 當用戶訪問 http://abc.com/a 時, 不能直接從 location / 轉發到 tomcat, 這會造成根目錄錯誤, 所以先精確匹配該URL, 使用return
功能重定向到 http://abc.com/a/ 或 http://abc.com/a/index.jsp
location = /a {
return http://abc.com/a/index.jsp; # 302重定向
}
響應如下:
$ curl -I abc.com/a
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.14.2
Date: Sat, 27 Apr 2019 06:55:04 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://abc.com/a/index.jsp
轉發 /a/* 到tomcat:
proxy_intercept_errors on; # 開啟代理錯誤攔截
location /a/ {
proxy_pass http://tomcat/Shop/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
error_page 404 /404; # 404頁面, 這是一個內部重定向
}
location = /404 {
try_files /static/err.htm =404; # try_files 依次查詢文件, 若無則返回一個指定的狀態碼
}
這樣可以讓 Nginx 幫我們完成一些有用的功能, 但事實上 Nginx 還可以做更多, 比如反向代理偽裝靜態
來看這條語句:
location = /a/index {
proxy_pass http://abc.com/a/index.jsp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
訪問 http://abc.com/a/index, 在本地測試, tomcat 中有日志:
注意, 上游服務器可能會301 302重定向到內網服務器, 如果在test目錄下寫一個index.jsp, 那么
當用戶訪問http://abc.com/a/test時, tomcat會返回一個302, 重定向到Location: http://abc.com/Shop/test/,
這時要么開啟代理錯誤攔截, 遞歸錯誤頁面, 即循環內部重定向 (我暫時不知道怎么實現)
要么修改Response中的Location數據, 使用proxy_redirect
可以重定向報文代理:
proxy_redirect http://$host/Shop/ http://$host/a/;
Nginx + tomcat 配置如下
這些雖然有用, 但是要想發揮更大的威力, 不得不提 rewrite 了.
## Nginx URL重寫
> URL重寫主要使用正則表達式完成
1 upstream tomcat {
2 server 127.0.0.1:8080;
3 }
4
5 server {
6 listen 80;
7 server_name *.javac.ga;
8
9 root /home/d/www;
10 index index.htm index.html;
11
12 #添加 response header
13 add_header developer "develon";
14 add_header 原始uri "$uri$is_args$args";
15
16 #設置代理 Header
17 proxy_set_header Host $host;
18 proxy_set_header X-Real-IP $remote_addr;
19 proxy_set_header Cookie $http_cookie;
20 proxy_set_header X-Forwarded-For $http_add_x_forwarded_for;
21
22 #錯誤處理
23 error_page 404 = @404; # 全局404
24 proxy_intercept_errors on; # 開啟代理錯誤攔截
25 fastcgi_intercept_errors on; # cgi錯誤攔截
26 #recursive_error_pages on; # 遞歸錯誤頁面
27
28
29 location / {
30 }
31
32 location /demo/ {
33 proxy_pass http://tomcat/HeadFirstJSP/;
00 proxy_cookie_path /HeadFirstJSP /demo;
34
35 if ($uri ~ "\.jsp$") {
36 rewrite "^/demo/(.+)\.jsp$" "/demo/$1" redirect;
37 }
38
39 if ($uri ~ "/([^\.]+)$") {
40 rewrite "^/demo/(.+)$" "/HeadFirstJSP/$1.jsp" break;
41 }
42
43 proxy_redirect /HeadFirstJSP /demo;
44 error_page 404 = /demo/static/err?err=$uri;
45 }
46
47 location @404 {
48 root /home/d/www;
49 try_files /err.html =404;
50 }
51 }
52
53 server {
54 listen 80 default;
55 return 444;
56 }
該配置的問題及解決辦法:
最簡單粗暴的配置: