更新时间:2022-09-24 23:21:40
D9-New-Nginx-Rewrite
首先看几个例子!
例子1
Discuz(X2.5) URL 静态化(伪静态)
Nginx Rewrite 代码
Nginx Rewrite 过程
论坛主题列表页 {fid}, {page} forum-{fid}-{page}.html
browser
http://bbs.test.com/forum-2-1.html
|
nginx rewrite
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
|
real url
http://bbs.test.com/forum.php?mod=forumdisplay&fid=2&page=1
论坛主题内容页 {tid}, {page}, {prevpage} thread-{tid}-{page}-{prevpage}.html
browser
http://bbs.test.com/thread-8-1-1.html
|
nginx rewrite
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
|
real url
http://bbs.test.com/forum.php?mod=viewthread&tid=8&extra=page%3D1&page=1
例子2
Wordpress(3.4.1) 固定链接设置(伪静态)
默认 http://blog.test.com/?p=123
月份和名称型 http://blog.test.com/index.php/2012/08/sample-post/
/index.php/%year%/%monthnum%/%postname%/
Nginx Rewrite 代码
Nginx Rewrite 过程
browser
http://blog.test.com/index.php/2012/08/vc-load/v9-1/
|
nginx rewrite
rewrite (.*) /index.php last;
|
real url
http://blog.test.com/?attachment_id=149
例子3
例子4
http://abc.com/products.php?id=39-0-0-10
重写为
http://abc.com/products/39-0-0-10.html
Nginx Rewrite 代码
URL重写模块
1 URL重写模块
这个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置。
如果这个指令在server字段中指定,那么将在被请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。
如果在location中执行这个指令产生了新的URI,那么location又一次确定了新的URI,这样的循环可以最多执行10次,超过以后nginx将返回500错误。
2 指令
2.1 break
示例:
2.2 return
2.3 set
示例:
2.4 if
可以在判断语句中指定下列值:
1 一个变量的名称;不成立的值为:空字符传”“或者一些用“0”开始的字符串。#
2 一个使用=或者!=运算符的比较语句。
3 使用符号~*和~模式匹配的正则表达式:
~为区分大小写的匹配。
~*不区分大小写的匹配(firefox匹配FireFox)。
!~和!~*意为“不匹配的”。
4 使用-f和!-f检查一个文件是否存在。
5 使用-d和!-d检查一个目录是否存在。
6 使用-e和!-e检查一个文件,目录或者软链接是否存在。
7 使用-x和!-x检查一个文件是否为可执行文件。
正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。
示例:
注意:红色字符
注意:内置变量$invalid_referer用指令valid_referers指定。
2.5 rewrite
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
1 last - 完成重写指令,之后搜索相应的URI或location。
2 break - 完成重写指令,之后停止搜索
3 redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
4 permanent - 返回301永久重定向。
注意:如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“Host”头或者server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名,如果你总是想让nginx使用“Host”头,可以在server_name使用“*”通配符(查看http核心模块中的server_name)。例如:
但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。
//last 与 break 用来实现URI重写,浏览器地址栏URL地址不变,但是在服务器端访问的路径已经发生了变化。
//redirect 与 permanent 用来实现URL跳转,浏览器地址栏会显示跳转后URL地址。
//last 与 break 是有区别的,last标记 在匹配后继续搜索,而break 标记在匹配后则停止搜索。
//因此,一般在根location中 (location /),或者直接写在server 标签中的rewrite 规则请使用last标记,而在非根location中 (location /bbs/)请使用break标记。
如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:
注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。
例如要重写以下的URL:
/photos/123456
为:
/path/to/photos/12/1234/123456.png
则使用以下正则表达式(注意引号):
如果指定一个“?”在重写的结尾,Nginx将丢弃请求中的参数,即变量$args,当使用$request_uri或$uri&$args时可以在rewrite结尾使用“?”以避免nginx处理两次参数串。
在rewrite中使用$request_uri将www.example.com重写到example.com:
同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:
注意$args变量不会被编译,与location过程中的URI不同(参考http核心模块中的location)。
参考
URL重写模块(Rewrite)
结束
更多请:
linux 相关 37275208
vmware 虚拟化相关 166682360
本文转自 dongnan 51CTO博客,原文链接:http://blog.51cto.com/dngood/1004837