zoukankan      html  css  js  c++  java
  • 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;
    		}
    	}
    

    判断文件或目录是否存在

  • 相关阅读:
    IOS 沙盒机制 浅析
    IOS CALayer(二)
    IOS CALayer(一)
    IOS 二维码扫描
    IOS 二维码生成
    UIView属性
    JSON 与 XML 的比较
    Xcode 中 pch 文件配置
    Error:linker command failed with exit code 1 (use -v to see invocation)
    开发常用宏
  • 原文地址:https://www.cnblogs.com/blxt/p/12106211.html
Copyright © 2011-2022 走看看