详解常用的nginx rewrite重写规则

发布时间:2024-06-08 点击:86
服务器
本文提供一些常用的rewrite重写规则,用来美化网页的链接。规则里面的$1$2你不知道是怎么来的话,只要记住,第一个()里面的是$1,第二个()里面的是$2.
请求的url是给人看的,重写后的url是给电脑看的。
执行搜索
这个规则的目的是为了执行搜索,搜索url中包含的关键字。
请求的url//hqidi.com/search/some-search-keywords
重写后url//hqidi.com/search.php?p=some-search-keywords
重写规则 rewrite ^/search/(.*)$ /search.php?p=$1?;
用户个人资料页面
大多数运行访问者注册的动态网站都提供一个可以查看个人资料的页面,这个页面的url包含用户的uid和用户名
请求的url//hqidi.com/user/47/dige
重写后url//hqidi.com/user.php?id=47&name=dige
重写规则 rewrite ^/user/([0-9] )/(. )$ /user.php?id=$1&name=$2?;
多个参数
有些网站对字符串参数使用不同的语法,例如 通过斜线“/”来分隔非命名参数
请求的url//hqidi.com/index.php/param1/param2/param3
重写后url//hqidi.com/index.php?p1=param1&p2=param2&p3=param3
重写规则 rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;
类似百科的格式
这种格式特点,一个前缀目录,后跟文章名称
请求的url//hqidi.com/wiki/some-keywords
重写后url//hqidi.com/wiki/index.php?title=some-keywords
重写规则 rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;
论坛
论坛一般用到两个参数,一个话题标识(topic)一个出发点(starting post)
请求的url//hqidi.com/topic-1234-50-some-keywords.html
重写后url//hqidi.com/viewtopic.php?topic=1234&start=50
重写规则 rewrite ^/topic-([0-9] )-([0-9] )-(.*)\\\\.html$ viewtopic.php?topic=$1&start=$2?;
西部数码站的文章
这种url结构的特点,由一个文章标识符,后跟一个斜线,和一个关键字列表组成。
请求的url//hqidi.com/88/future
重写后url//hqidi.com/atricle.php?id=88
重写规则 rewrite ^/([0-9] )/.*$ /aticle.php?id=$1?;
最后一个问号
若被替换的uri中含有参数(类似/app/test.php?id=5之类的uri),默认情况下参数会被自动附加到替换串上,可以通过在替换串的末尾加上?标记来解决这一问题。
rewrite ^/users/(.*)$ /show?user=$1? last;
比较一个加上?标记和不加?标记的url跳转区别:
rewrite ^/test(.*)$ //hqidi.com/home premanent;
访问//hqidi.com/test?id=5 经过301跳转后的url地址为 //hqidi.com/home?id=5
rewrite ^/test(.*)$ //hqidi.com/home? premanent;
访问//hqidi.com/test?id=5 经过301跳转后的url地址为 //hqidi.com/home
nginx的rewrite功能需要pcre软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要pcre的支持
rewrite是实现url重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
nginx rewrite指令执行顺序
1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
2.执行location匹配
3.执行选定的location中的rewrite指令
如果其中某步uri被重写,则重新循环执行1-3,直到找到真实存在的文件。
如果循环超过10次,则返回500 internal server error错误。
flag标志位
rewrite的语法很简单,如:
rewrite regex url [flag];rewrite是关键字,regex是正则表达式,url是要替代的内容,[flag]是标记位的意思,它有以下几种值:
last: 相当于apache的[l]标记,表示完成rewrite
break: 停止执行当前虚拟主机的后续rewrite指令集
redirect: 返回302临时重定向,地址栏会显示跳转后的地址
permanent: 返回301永久重定向,地址栏会显示跳转后的地址
因为301和302不能简单的只返回状态码,还必须有重定向的url,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令
来看一个简单实例:
rewrite ^/listings/(.*)$ /listing.html?listing=$1 last;rewrite ^/images/(.*)_(\\\\d )x(\\\\d )\\\\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;第一条重写规则中,我们可以使用友好的url:http://mysite.com/listings/123代替http://mysite.com/listing.html?listing=123,就相当于我们在浏览器的地址栏中输入http://mysite.com/listings/123后,实际访问的url资源是http://mysite.com/listing.html?listing=123。
第二条规则中,对形如http://mysite.com/images/bla_500x400.jpg的文件请求,重写到http://mysite.com/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。
if指令与全局变量
if指令语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
来看代码规则:
if ($http_user_agent ~ msie) { rewrite ^(.*)$ /msie/$1 break;} //如果ua包含msie,rewrite请求到/msid/目录下 if ($http_cookie ~* id=([^;] )(?:;|$)) { set $id $1; } //如果cookie匹配正则,设置变量$id等于正则引用部分 if ($request_method = post) { return 405;} //如果提交方法为post,则返回状态405(method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k;} //限速,$slow可以通过 set 指令设置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 if ($args ~ post=140){ rewrite ^ http://mysite.com/ permane

腾讯云服务器购买mysql怎么用
怎么用云服务器 云服务器都具有哪些优势
云服务器哪个价格便宜
实体机与云服务器相比哪个好
php如何删除指定图片
百度云服务器如何方多个网站
建设网站对于文本方面有什么要求
建设网站之前的筹备与谋划有哪些方面?