一、重定向
正則表達式匹配:
* ~ 為區分大小寫匹配 * ~* 為不區分大小寫匹配 * !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配
文件及目錄匹配:
* -f和!-f用來判斷是否存在文件 * -d和!-d用來判斷是否存在目錄 * -e和!-e用來判斷是否存在文件或目錄 * -x和!-x用來判斷文件是否可執行
flag標記:
* last 相當於Apache里的[L]標記,表示完成rewrite * break 終止匹配, 不再匹配后面的規則 * redirect 返回302臨時重定向 地址欄會顯示跳轉后的地址 * permanent 返回301永久重定向 地址欄會顯示跳轉后的地址
可用的全局變量有,可以用做條件判斷:
$args, 請求中的參數; $content_length, HTTP請求信息里的"Content-Length"; $content_type, 請求信息里的"Content-Type"; $document_root, 針對當前請求的根路徑設置值; $document_uri, 與$uri相同; $host, 請求信息中的"Host",如果請求中沒有Host行,則等於設置的服務器名; $limit_rate, 對連接速率的限制; $request_method, 請求的方法,比如"GET"、"POST"等; $remote_addr, 客戶端地址; $remote_port, 客戶端端口號; $remote_user, 客戶端用戶名,認證用; $request_filename, 當前請求的文件路徑名 $request_body_file $request_uri, 請求的URI,帶查詢字符串; $query_string, 與$args相同; $scheme, 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; $server_protocol, 請求的協議版本,"HTTP/1.0"或"HTTP/1.1"; $server_addr, 服務器地址,如果沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(造成資源浪費); $server_name, 請求到達的服務器名; $server_port, 請求到達的服務器端口號; $uri, 請求的URI,可能和最初的值有不同,比如經過重定向之類的。
return指令
該指令用於結束規則的執行並返回狀態碼給客戶端。 可使用server, location, if 區域; 示例:如果訪問的URL以".sh"或".bash"結尾,則返回403狀態碼 location ~ .*.(sh|bash)?$ { return 403; }
rewrite 指令
使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標志位實現url重寫以及重定向; 可以使用在 server, location, if 區域; rewrite 語法格式 rewrite regex(正則) replacement flag (rewrite 源地址 目標地址) flag: break last redirect permanent last: last一般寫在server和if中 停止執行其他重寫規則,根據URI繼續搜索其他location break:break一般使用在location url重寫后,直接使用當前資源,不再執行location里余下的語句,完成本次請求 redirect:302臨時重定向,地址欄改變,爬蟲不更新URI permanent:301永久重定向。地址欄改變,爬蟲更新URI
重定向案例:
server { ... server_name www.aa.com aa.com www.bb.com bb.com ...; if ($host = 'www.aa.com' ) { return http://www.baidu.com$request_uri; } if ($host = 'www.aa.info' ) { #也可以加上301重定向碼 return 301 http://www.baidu.com$request_uri; } ... }
二、反向代理
反向代理:是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,
此時代理服務器對外就表現為一個服務器。
proxy_pass
可使用字段:location, location中的if字段; 這個指令設置被代理服務器的地址和被映射的URI,地址可以使用主機名或IP加端口號的形式,例如:proxy_pass http://192.168.10.129/url proxy_pass 也可以配合upstream使用 location /fx { proxy_pass http://127.0.0.1:8555/fx; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_next_upstream off; proxy_connect_timeout 30; proxy_read_timeout 300; proxy_send_timeout 300; } ----------------- ... upstream dd { server 127.0.0.1:8080; } ... proxy_pass http://dd; ...