首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx Rewrite 重写URI

Nginx Rewrite 重写URI

作者头像
用户1560186
发布2019-11-19 20:49:56
2.7K0
发布2019-11-19 20:49:56
举报
文章被收录于专栏:运维录运维录


不知不觉 nginx主题的文章写了60+篇,有最早的也有最近的,有些是记录安装配置,有些是记录问题解决方法,内容质量有深也有浅参差不齐,随着技术迭代有些文章已经过时了(例如Docker时代)不再符合当前的技术需求,而有些文章虽然久远但是仍有有意义(例如Nginx HA),所以有了梳理这些文章的想法,目标有两个吧,一是回顾下过去的文章巩固下知识点,二是去其糟粕留下精华将有价值的文章搬迁(搬砖)的微信公众号。

今天的这篇文章发布于2013年03月,是介绍如何使用 nginx rewrite指令完成URI重写工作,例如常见的SEO优化(集中权重)将一级域名test.com 301重定向到二级域名www.test.com,或者PHP项目伪静态需求支持等等。这篇文章除rewrite指令外还涉if指令与rewrite指令配合使用。

下面的nginx配置文件有两个 rewrite配置示例。


rewrite 指令

语法: rewrite regex replacement flag 默认值: none 使用字段: server, location, if 功能: 按照相关的正则表达式或者字符串来重写URI,rewrite指令按照在配置文件中出现的顺序执行,可以在重写指令后面添加需要的标记。

flag 标记:

last 完成重写指令,之后搜索相应的URI或location。 break 完成重写指令,之后停止搜索。 redirect 返回302临时重定向,浏览器地址栏会显示跳转后URL地址。 permanent 返回301永久重定向。浏览器地址栏会显示跳转后URL地址。

引用张宴老师的一段话

last 与 break 用来实现URI重写,浏览器地址栏URL地址不变,但是在服务器端访问的路径已经发生了变化。 redirect 与 permanent 用来实现URL跳转,浏览器地址栏会显示跳转后URL地址。 last 与 break 是有区别的,last标记在匹配后继续搜索,而break 标记在匹配后则停止搜索。 因此一般在根location中(即 location /{..}),或者直接写在 server标签中的rewrite规则使用last标记,而在非根location中(比如 location /pic/{..})使用break标记。

注意:

如果替换的字符串以http(s)://开头,请求将被301或者302 URL重定向,并且不再执行多余的rewrite指令。

正则表达式的一部分可以用圆括号括起来,方便之后按照顺序用$1-$9来引用,例如上例中的$1与$2引用方式。


使用curl命令测试 rewrite 规则。

curl -IL test.com HTTP/1.1 301 Moved Permanently Server: nginx 省略.... Location: http://www.test.com/HTTP/1.1 200 OK Server: nginx 省略....

可以从返回结果中看到 curl命令一共请求了两次,第一次服务器返回301状态码 test.com被重定向新的Location,第二次访问新的地址是 www.test.com 返回200状态码 。


相对路径

另外需要说明的是 rewrite正则表达式部分只对相对路径有效。

如果你想匹配主机名(比如 test.com 参考上面例子),请与 if指令、"$host"变量配合使用。

如果你想匹配参数(比如 id=1 参考下面例子),请与 if指令、"$query_string"变量配合使用。

什么是相对路径?以 http://www.test.com/demo?id=1 为例:

主机名 "www.test.com"

相对路径"/demo"

参数"?id=1"

配置文件

{ #... 其它配置项省略if ($query\_string ~\* "id=(.+)$") { rewrite ^/ http://demo.com/so.php permanent; }}


if 指令

语法: if (condition) { … } 默认值: none 使用字段: server, location 功能: 判断一个条件,如果条件成立则后面的大括号内的指令将执行,相关配置从上级继承。

条件可以是下边的任意一个:

变量名称,不成立的值为: ""(空字符串)"或者一些用"0"开始的字符串。

变量比较可以使用 = (表示等于)或者使用 != (表示不等于)运算符。

正则表达式的模式匹配使用符号 ~*或~:

~为区分大小写的匹配、~\*不区分大小写的匹配(abc匹配ABC),!~和!~\*意为"不匹配的"。

测试目标 -f/-d/-e/-x

使用-f和!-f检查一个文件是否存在。
使用-d和!-d检查一个目录是否存在。
使用-e和!-e检查一个文件或者目录是否存在。
使用-x和!-x检查一个文件是否为可执行文件。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用curl命令测试 rewrite 规则。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档