url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态、301重定向、浏览器定向等

rewrite

语法

在配置文件的server块中写,如:

server {rewrite 规则 定向路径 重写类型;
}
  • 规则:可以是字符串或者正则来表示想匹配的目标url
  • 定向路径:表示匹配到规则后要定向的路径,如果规则里有正则,则可以使用$index来表示正则里的捕获分组
  • 重写类型:
    • last :相当于Apache里德(L)标记,表示完成rewrite,浏览器地址栏URL地址不变
    • break;本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变
    • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
    • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

简单例子

server {# 访问 /last.html 的时候,页面内容重写到 /index.html 中rewrite /last.html /index.html last;# 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配rewrite /break.html /index.html break;# 访问 /redirect.html 的时候,页面直接302定向到 /index.html中rewrite /redirect.html /index.html redirect;# 访问 /permanent.html 的时候,页面直接301定向到 /index.html中rewrite /permanent.html /index.html permanent;# 把 /html/*.html => /post/*.html ,301定向rewrite ^/html/(.+?).html$ /post/$1.html permanent;# 把 /search/key => /search.html?keyword=keyrewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
}

last和break的区别

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

  • last一般写在server和if中,而break一般使用在location中
  • last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  • break和last都能组织继续执行后面的rewrite指令

location里一旦返回break则直接生效并停止后续的匹配location

server {location / {rewrite /last/ /q.html last;rewrite /break/ /q.html break;}location = /q.html {return 400;}
}
  • 访问/last/时重写到/q.html,然后使用新的uri再匹配,正好匹配到locatoin = /q.html然后返回了400
  • 访问/break时重写到/q.html,由于返回了break,则直接停止了

if判断

只是上面的简单重写很多时候满足不了需求,比如需要判断当文件不存在时、当路径包含xx时等条件,则需要用到if

语法

if (表达式) {
}
  • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
  • 直接比较变量和内容时,使用=或!=
  • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

一些内置的条件判断:

  • -f和!-f用来判断是否存在文件
  • -d和!-d用来判断是否存在目录
  • -e和!-e用来判断是否存在文件或目录
  • -x和!-x用来判断文件是否可执行

内置的全局变量

$args :这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。 $content_type : 请求头中的Content-Type字段。 $document_root : 当前请求在root指令中指定的值。 $host : 请求主机头字段,否则为服务器名称。 $http_user_agent : 客户端agent信息 $http_cookie : 客户端cookie信息 $limit_rate : 这个变量可以限制连接速率。 $request_method : 客户端请求的动作,通常为GET或POST。 $remote_addr : 客户端的IP地址。 $remote_port : 客户端的端口。 $remote_user : 已经经过Auth Basic Module验证的用户名。 $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。 $scheme : HTTP方法(如http,https)。 $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。 $server_name : 服务器名称。 $server_port : 请求到达服务器的端口号。 $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri : 与$uri相同。 

如:

访问链接是:http://localhost:88/test1/test2/test.php
网站路径是:/var/www/html$host:localhost
$server_port:88 $request_uri:http://localhost:88/test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:/var/www/html $request_filename:/var/www/html/test1/test2/test.php 

例子

# 如果文件不存在则返回400
if (!-f $request_filename) {return 400;
}# 如果host不是xuexb.com,则301到xuexb.com中
if ( $host != "xuexb.com" ){rewrite ^/(.*)$ https://xuexb.com/$1 permanent;
}# 如果请求类型不是POST则返回405
if ($request_method = POST) {return 405;
}# 如果参数中有 a=1 则301到指定域名
if ($args ~ a=1) {rewrite ^ http://example.com/ permanent;
}

在某种场景下可结合location规则来使用,如:

# 访问 /test.html 时
location = /test.html {# 默认值为xiaowuset $name xiaowu;# 如果参数中有 name=xx 则使用该值if ($args ~* name=(\w+?)(&|$)) {set $name $1;}# 301rewrite ^ /$name.html permanent;
}

上面表示:

  • /test.html => /xiaowu.html
  • /test.html?name=ok => /ok.html?name=ok

location

语法

server块中使用,如:

server {location 表达式 {}
}

location表达式类型

  • 如果直接写一个路径,则匹配该路径下的
  • ~ 表示执行一个正则匹配,区分大小写
  • ~* 表示执行一个正则匹配,不区分大小写
  • ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
  • = 进行普通字符精确匹配。也就是完全匹配。

优先级

  1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  2. ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  3. 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  4. 常规字符串匹配类型。按前缀匹配。

例子 - 假地址掩饰真地址

server {# 用 xxoo_admin 来掩饰 adminlocation / {# 使用break拿一旦匹配成功则忽略后续location rewrite /xxoo_admin /admin break; } # 访问真实地址直接报没权限 location /admin { return 403; } } 

nginx配置url重写相关推荐

  1. Cento7+Nginx 之 URL重写

    Cento7+Nginx  之  URL重写 我们前一篇文章写了一个Cento7+Nginx 反向代理实现多域名跳转,今天主要介绍一下Cento7+Nginx  之  URL重写, Hostname: ...

  2. Nginx实现URL重写

    本文利用Nginx实现URL重写,本文使用Nginx与静态页面配合重写URL. 1.准备工作. 结合本文场景,需要安装Nginx. 1.1 关于Linux系统安装Nginx可以参考我的文章---(传送 ...

  3. IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)

    IIS配置Url重写实现http自动跳转https的重定向方法(100%解决) 参考文章: (1)IIS配置Url重写实现http自动跳转https的重定向方法(100%解决) (2)https:// ...

  4. iis 10 配置 URL重写不生效

    上下文 因此前一直应用运维的一个项目需要升级服务器,将 windows server 2008 升级为 2016版本并完成项目的迁移. 本篇文章就是在升级部署过程中遇到的一些坑,潦以记录,请各路神仙轻 ...

  5. IIS配置URL重写

    IIS配置URL重写 一开始IIS配置伪静态,参考了 http://www.cnblogs.com/simoje/p/4764392.html http://www.cnblogs.com/Fooo/ ...

  6. nginx配置url重定向_Nginx配置URL重写

    URL重写是指通过配置conf文件,以让网站的URL中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态.301重定向.浏览器定向等. Nginx允许使用正则表达式重写URI(需PCRE库),并且 ...

  7. Nginx之URL重写

    1.URL重写模块(Rewrite) 摘要 这个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置.如果这个指令在server字段中指定,那么将在被请求的lo ...

  8. iis5.1/6.0/7.0+ 配置url重写 无扩展名伪静态

    最近在搞url重写 遇到iis 无扩展名及html映射问题 供后人查看 因为考虑功能比较多(URLRewriter组件有些功能满足不了要求)所以就用了HttpModule方法重写 iis5.1中 添加 ...

  9. Yii 1.0 伪静态即Yii配置Url重写(转)

    第一步:配置 URL Management(网址管理) 只需要在config文件夹下面的main.php文件中进行配置就好了 到配置文件中开启: LoadModule rewrite_module m ...

最新文章

  1. Cocos2dx源码记录(1) CCGLProgram
  2. 零下273.14度稳定运行!中科院自主研发稀释制冷机,高端科研仪器取得突破进展...
  3. 32时间片轮转_系统时间
  4. mysql正则提取字符串_mysql字符串查找截取与正则表达式的联合应用
  5. 执行Bean 实例化
  6. Spring Cloud OpenFeign使用教程
  7. MyBatis-Plus_查询返回实体对象还是map?
  8. 产品新人如何快速成长?
  9. 正则表达式批量替换 单引号
  10. Watermaker水位线/水印
  11. Mac搭建本地服务器及测试demo
  12. thinkphp 访问根目录文件
  13. java中验证国际手机号码
  14. vue2.x 如何更换网页logo
  15. LOVE2D中实现一个简单的摇杆
  16. python 生成带有alpha 通道的视频
  17. EXCEL打开文件密码如何找回
  18. win10 uwp 如何开始写 uwp 程序
  19. H3C SE 教程笔记——构建安全优化的广域网(上)
  20. Fuchsia 系统的编译和探索

热门文章

  1. 图形驱动程序和显卡驱动什么区别_科普:游戏显卡和专业图形显卡存在的区别...
  2. java 数据结构 数据库_数据库索引背后的数据结构
  3. postman发送报文时请求时间超时因为什么_面试官说不要再问我三次握手和四次挥手是什么了...
  4. static代码块什么时候运行_健康的代码:什么时候该注释?
  5. linux 关于虚拟内存的几个系统调用
  6. Spark streaming细粒度工作原理
  7. ieee latex 双栏_用Latex写学术论文: IEEE Latex模板和文档设置(\documentclass)
  8. 端口映射 - 专业术语 - 发问篇
  9. html ajax提交表单实例,jQuery使用$.ajax提交表单完整实例
  10. simpla是基于laravel5的php,一个基于laravel5.1的后台