Nginx URL重寫


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 }

該配置的問題及解決辦法:

最簡單粗暴的配置:



免責聲明!

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



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