1. 程式人生 > 其它 >Nginx Rewrite資源重定向

Nginx Rewrite資源重定向

# Rewrite功能配置
# Rewrite功能主要是實現了url重寫
# 如:你輸入www.jd123.com,你可以通過Rewrite讓它重定向到www.jd.com
# Rewrite的實現依賴與PCRE的支援,因此要使用先你需要先安裝OCRE庫。
# Nginx使用的是ngx_http_rewrite_module模組來解析和處理rewrite功能的相關配置的。
# Rewrite相關指令
# set指令:該指令用來設定一個新的變數。
# 語法: set $variable vale;
# 預設:空
# 位置:server、location、if
server {
  listen 
8081; server_name localhost; location /server { set $name TOM; set $age 18; default_type text/plain; return 200 $name=$age; } } # Rewrite常用全域性變數 # $args:變數中存放了請求URL中的請求引數。比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"arg1=value1&args2=value2"。功能和$query_string一樣。
# $http_user_agent:變數儲存的是使用者訪問伺服器的代理資訊(如果是瀏覽器訪問,記錄的是瀏覽器的相關版本資訊) # $host:訪問伺服器的server_name。 # $document_uri:儲存的是當前訪問地址的URI。比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"/server"和$uri # $document_root:變數儲存的是當前請求對應的location的root值。 # $document_length:儲存的是請求頭中的Content-Length的值。 # $content_length:儲存的是請求頭中的Content-Type。
# $http_cookie:儲存的是客戶端的cookie資訊,可以通過add_header Set-Cookie 'cookieName=value'來新增cookie資料。 # $limit_rate:儲存的是Nginx伺服器對網路連結速率的限制,也就是Nginx配置中的limit_rate指令設定的值,預設是0,不限制。 # $remote_addr:儲存1是客戶端的ip地址。 # $remote_port:客戶端與服務端建立連結的埠。 # $remote_user:儲存的了客戶端的使用者名稱,需要有認證模組才能獲取。 # $scheme:儲存了訪問的協議。http、https…… # $server_addr:儲存了伺服器的地址。 # $server_name:伺服器的名稱。 # $server_port:伺服器的埠。 # $server_protocol:客戶端請求協議的版本。如:HTTP/1.1 # $request_body_file:儲存了發給後端伺服器的本地檔案資源的名稱。 # $request_method:客戶端請求伺服器的方式。get、post等 # $request_filename:當前請求的資原始檔的路勁名。 # $request_uri:儲存了當前請求的URI,並且附帶請求引數,比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"/server?arg1=value1&args2=value2" # 這些變數也都可以在log中使用 server { listen 8081; server_name localhost; log_format main '$remote_addr - $request - $status'; location /server { set $name TOM; set $age 18; access_log logs/access.log main; default_type text/plain; return 200 $name=$age; } } # if指令:條件判斷 # 語法:if (condition){...} # 位置:server、location location /testif { set &username 'ROSE'; default_type text/plain; if ($args){ # 當$args等於0或者沒有值的時候返回False return 200 success; } if ($requests_method = POST){ #是post請求過來的為真,否則為假。!=:和=相反 RETURN 405; } if ($http_user_ahent ~* safari){ # 當$http_user_ahent包含safari的時候為真。safari你可以寫成你的正則表示式。~和~*的區別是~*不區分大小寫。 return 200 Chrome; } return 200 error; } # "-f"和"!-f"判斷請求檔案是否存在。 # "-d"和"!-d"判斷請求目錄是否存在。 # "-e"和"!-e"判斷請求檔案或者目錄是否存在。 # "-x"和"!-x"判斷請求的檔案是否是可執行檔案。 location / { root html; if (!-f $request_filename){ # 如果檔案不存在就返回file not found! return 200 '<h1> file not found!</h1>'; } } # break指令 # 該指令用於終端當前相同作用域中的其他Nginx配置。與該指令處於同一作用域的Nginx配置中,位於它前面的指令配置生效,位於後面的指令配置無效。 # 並且break還有另外一個功能就是終止當前匹配並把當前的URI在本location進行重定向訪問處理。 # 位置 server、location、if # 例子: location /testbreak { default_type text/plain; set $username JERRY; if ($args){ set $username TOM; # 執行 break; set $username ROSE; # 不執行 } add_header username $username; # 執行 return 200 'username $username'; # 重定向到 index index.html 這裡我們沒有配置index所以它走的預設dindex值。這就是上面說的終止當前並把當前的URI在本location重定向訪問處理。 } # return 指令 # 語法一:return code [text]; # 語法二:return code URL; # 語法三:return URL; 相當於:return 302 URL; 302就是重定向的相應碼。 # 位置:server、location、if # rewrite指令:該指令通過正則表示式的使用來改變URI。可以同時存在一個或者多個指令,按照順序一次對URL進行匹配和處理。 # 語法:rewrite regex replacement [flag]; //flag預設值:last # 位置:server、location、if # flag: last | break | redirect | permanent # regex:用來陪陪URI的正則表示式 # replacement:匹配成功後,用於替換URI中被擷取內容的字串、如果該字串式以"http://"或者"https://"開頭的,則不會繼續向下對uri進行其他處理,而是直接返回重寫後的URI給客戶端。 # 例子: location /rewrite { rewrite ^/rewrite/url\w*$ https://www.baidu.com; # 這裡重定向跳轉到www.baidu.com rewrite ^/rewrite/(test)\w*$ /$1; # 這裡重定向到location /test rewrite ^/rewrite/(demo)\w*$ /$1; # 這裡重定向到location /demo } location /test { default_type text/plain; return 200 test_success; } location /demo { default_type text/plain; return 200 demo_success; } # flag的用法 location /testflag { default_type text/plain; return 200 testflag_success; } location /rewriteflag { rewrite ^/rewrite/(testflag)\w*$ /$1; # rewrite ^/rewrite/(testflag)\w*$ /$1 last; //當匹配成功後會在location所在的整個server中找到/testflag location然後返回,並且瀏覽器中的地址不會發生任何重定向的變化 # rewrite ^/rewrite/(testflag)\w*$ /$1 break; //當匹配成功後會在當前location中查詢訪問的資源,然後返回給瀏覽器。這裡訪問的路勁是:rewriteflag/html/index.html # rewrite ^/rewrite/(testflag)\w*$ /$1 redirect;//臨時重定向到 "location /testflag",瀏覽器地址會變動 # rewrite ^/rewrite/(testflag)\w*$ /$1 permanent;//永久重定向到 "location /testflag",瀏覽器地址會變動 } # rewrite_log指令 # 該指令配置是否開啟URL重寫日誌的輸出功能 # 語法:rewrite_log on | off # 預設:off # 位置:http、server、location、if # 開啟後,URL重寫的相關日誌將以notice級別輸出到error指令配置的日誌檔案中去。 rewrite_log on; error_log logs/error.log notice; # 這裡錯誤日誌級別設定為notice。 # 案例:域名跳轉 server { listen 80; server_name www.it.com; location /test { default_type text/plain; return 200 test_success; } } server { listen 80; server_name www.abc.com www.abc.ccn; rewrite ^(.*) www.it.com$1; # $1當訪問的是www.abc.com/test的時候 $1指的就是/test } # 案例:域名映象 # 主要實現將資源分散到不同的主機上 server { listen 80; server_name www.abc.cn; location /user { rewrite ^/user(.*)$ http://www.otherhost.cn$1; # 這裡上面也講到過,並不會影響瀏覽器url地址,所以部分資源我們可以用專門的電腦去處理。 } location .emp{ default_type text/plain; return 200 '<h1>emp_access</h1>'; } } # 防盜鏈,我們也可以通過rewrite返回一個預設圖片