nginx location匹配及rewrite規則

location匹配規則

1. 實例

	server{
		location = \ {
			[配置A]
		}
		location / {
			[配置B]
		}
		location = /images/ {
			[配置C]
		}
		location ^~ /static/{
			[配置D]
		}
		localtion ~* \.(gif|jpg|png){
			[配置E]
		}
}

2. location語法規則

語法:

location  = | ~ | ~* | ^~ | @  /url/{		//注意 =、~、~*、^~ 、@是location的匹配規則,”|“表示或者
“
	......省略其他配置
}

規則說明:

符號 含義
= 字面精準匹配,如果匹配,則跳出匹配過程(不再進行正則匹配)
~ 開頭區分大小寫的正則匹配
~* 開頭不區分大小寫的正則匹配
^~ 開頭表示uri以某哥常規字符串開頭,理解爲匹配url路徑即可
/ 通用匹配,在沒有正則表達式匹配時,任何請求都會匹配到
@ 不是普通的location匹配,用於location內部重定向的變量
~ 開頭區分大小寫的正則匹配

多個location配置的匹配順序:

  • 首先匹配:"="
  • 其次匹配:"^~"
  • 再匹配:文件location書寫順序
  • 最後把所有請求交給通配符("/")

注意:每次匹配成功後,停止匹配,會按照本匹配的location處理請求

按照上面實例進行說明匹配順序:

  • 首先對比第一個location,如果匹配就會停止匹配,並按照配置A進行處理請求:
	location = \ {
		[配置A]
	}
  • 其次對比第二個location,如果匹配就會停止匹配,並按照配置D進行處理請求:
	location ^~ /static/{
			[配置D]
		}
  • 再按照順序依此進行對比,直到找到匹配的纔會停止,並按照所匹配的配置*進行處理請求
  • 如果以上無任何匹配項則會選擇通用選項,並按照所匹配的配置B進行處理請求:
	location / {
			[配置B]
		}

3. 應用舉例

  • 精準規則(=)
	location = / {
		root /var/ww/html/;
	}

此規則表示只匹配以默認地址進行訪問的請求,訪問地址:http://NginxIP/

  • 匹配url路徑(^~)
	location ^~ /static/ {
		root /var/www/html/static;
	}

此規則表示只匹配以" /static/ "開頭的地址進行訪問的請求,訪問地址:http://NginxIP/static/

  • 忽略大小寫(~*)
	location ~* \.(png|gif|jpg){
		root /var/www/html/;
	}

此規則表示只匹配" *.png | *.gif | *.jpg "的文件,訪問地址:http://NginxIP/test.png

	location ~* /Test/ {
		root /var/www/html/;
	}

此規則表示匹配url地址中存在Test的訪問請求,不區分大小寫test也可以,訪問地址:http://NginxIP/test/

  • 區分大小寫(~)
	location ~ /Test/{
		root /var/www/html/;
	}

此規則表示匹配url地址中存在Test的訪問請求,區分大小寫,test是進行匹配的,訪問地址:http://NginxIP/Test/

  • 默認匹配(所有規則都可匹配)
	location / {
		root /var/www/html;
	}

此規則爲默認匹配,他可以匹配所有以默認地址訪問的鏈接,訪問地址:http://NginxIP/login.html

  • 內部跳轉(@)
	location @index_error{
		root /var/www/error/
	}

此規則表示匹配以 "/index/ "開頭的請求,如果鏈接狀態404,會匹配到這條規則

rewrite規則詳解

nginx的rewrite功能和apache一樣,rewrite的主要功能是實現RUL地址的重定向。Nginx的rewrite功能是由PCRE軟件支持,rewrite模塊即ngx_http_rewrite_module模塊。從某種意義上可以說爲了美觀或者搜索引起的友好搜索,提高排名等

1.實例

	server{
		listen 80;
		server_name www.jkyst.xyz jkyst.xyz;
		if($host != 'www.jkyst.xyz' ){
			rewrite ^/(.*)$ http://www.jkyst.xyz/$1 permanent;
		}
		location ~.*\.(png|gif|jpg){
			return 403;
		}
	}

2.rewrite語法規則

語法:

	rewrite		regex		replacement		[flag]

rewrite:rewrite重寫的關鍵字不可省略
regex:這裏寫的是正則表達式
replacement:這裏是重新內容
flag:這裏是最後的flag標記

flag標記說明:

flag標記 說明
last 也就是apache裏的(L)標記,表示完成rewrite,URL地址不會改變
break 本條規則匹配成功後,會停止匹配,不再匹配後面的規則,URL地址不會改變
redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent 返回301永久重定向,瀏覽器地址欄顯示跳轉後的URL地址,Nginx返回response狀態碼301

相關符號說明:

符號 說明
* 代表前面0或者多個字符
+ 代表前面1或者多個字符
? 代表前面0或1個字符
^ 代表字符串的開始位置
$ 代表字符串結束位置
$n 代表字符串結束第n個參數
. 通配符,代表任何字符

3.應用實例

  • 多域名跳轉到同一域名
	server{
		listen 80;
		server_name www.jkyst.xyz jkyst.xyz abc.jkyst.xyz;
		if($host != 'www.jkyst.xyz'){
			rewrite ^/(.*)$ http://www,jkyst.xyz/$1 permanent;
		}
	}

當訪問 “abc.jkyst.xyz” 時會自動跳轉到 “www.jkyst.xyz”,這裏出現 “if” 語句用於判斷,判斷結果爲true則執行語句內部的 rewrite重寫

  • 當文件不存在時重定向到指定文件
	server{
		listen 80;
		server_name www.jkyst.xyz;
		if(!-e $request_filename){
			rewrite  ^/test/(.*)$ http://www.jkyst.xyz/test1/$1 permanent;
		}
	}

當訪問 “test” 目錄下的文件或目錄不存在時,則跳轉到 "test1"下面的此文件或者目錄,跳轉後會將URL進行轉換

	server{
		listen 80;
		server_name www.jkyst.xyz;
		if(!-e $request_filename){
			rewrite ^/test/(.*)$ index.html last;
		}
	}

表示當訪問 “test” 目錄下的文件或目錄不存在時,則重定向到 "index.html"文件,跳轉後URl不會進行轉換

	server{
			listen 80;
			server_name www.jkyst.xyz;
			if(!-e $request_filename){
				rewrite ^/test/([0-9a-z]+)/([0-9a-z]+)/(.*)$ http://www.jkyst.xyz/test/$1$2$3 permanent;
			}
	}

目錄切換,表示將原目錄轉換成其他目錄,【0-9a-z】表示轉換後目錄名稱

  • 禁止訪問.sh後綴的文件
	server{
	......其他配置
	location ~.*\.(sh)${
		return 405;
	}
}

表示當訪問 "*.sh"的文件就會返回405錯誤

  • 匹配用戶瀏覽器代理信息
	server{
		listen 80;
		server_name www.jkyst.xyz;
		if ( $http_user_agent ~* ("Android")|(iPhone)){
			rewrite ^/test/(.*)$ http://www.jkyst.xyz/test/$1  permanent;
		}
	}

表示當匹配到瀏覽代理爲Android和iPhone時進行重定向 "test"目錄下的文件,改變訪問的地址

  • 禁止htaccess
	server{
		location ~//.ht {
	         deny all;
	       }
	   }

4.文件目錄匹配

參數 介紹
-f 判斷文件是否存在 返回值true爲存在
!-f 判斷文件是否存在 返回值false爲不存在
-d 判斷目錄是否存在 返回值true爲存在
!-d 判斷目錄是否存在 返回值true爲不存在
-e 判斷文件或目錄是否存在 返回值true爲存在
!-e 判斷文件或目錄是否存在 返回值true爲不存在
-x 判斷文件是否可執行 返回值true爲可執行
!-x 判斷文件是否可執行 返回值true爲不可執行

舉例說明:

	server{
		listen 80;
		server_name www.jkyst.xyz;
		if(!-e $request_filename){
			rewrite  ^/test/(.*)$ http://www.jkyst.xyz/test1/$1 permanent;
		}
	}

判斷文件或目錄是否存在

發佈了25 篇原創文章 · 獲贊 45 · 訪問量 7178
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章