[id_433572559]<[id_861882008]p>
该系统将各类请求精准地指向相应的处理流程。
1.location的用法
location ~* /js/.*/.js 以 =起初,需确保实现精确的对应;若仅对根目录的请求进行匹配,则其后不应附加任何字符。以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配 以~ 开头,表示区分大小写的正则匹配; 以~* 开头,表示不区分大小写的正则匹配 以“/”作为起始符,进行通用匹配;若不存在其他匹配项,所有请求都将被该匹配模式覆盖。
location 的匹配顺序是“先匹配正则,再匹配普通”。
在处理location的匹配问题时,其顺序实际上是“先进行普通匹配开yun体育app官网网页登录入口,随后才是正则匹配”。我这样表述,很可能会引起大家的质疑,因为按照“先匹配普通kaiyun.ccm,再匹配正则”的规则,无法解释为何大家在实际操作中更倾向于“先匹配正则,再匹配普通”的做法。对此,我暂时可以这样解释:导致这种误解的原因在于,正则表达式的匹配结果会覆盖掉普通表达式的匹配效果。
2.location用法举例
location正则写法:
# 精确匹配 / ,主机名后面不能带任何字符串
location = / { [ configuration A ] }
所有地址均以斜杠“/”为起始,因此本规则将作为最后的选择,用于响应默认请求。
# 但是正则和最长字符串会优先匹配
location / { [ configuration B ] }
例:
location /严禁对特定内容进行转发,请确保通过以下路径进行数据传输:proxy_pass http://。//server_pools; 此规则仅在所有其他条件不满足时才会生效;它将成为最终被应用的规定,且其匹配程度相对较低。举例来说,若网站地址为www.blog.com,在未输入任何额外信息的情况下,该规则将发挥作用。
其他的规则也不匹配的时候,最后交给负载均衡池的服务器
拦截所有以“/documents/”为开头的网址,在完成匹配后,需继续向下进行搜索。
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
location /documents/ { [ configuration C ] }
例:
location /static/ { rewrite ^ http://www.abc.com ; 配置此功能时,若设定网站域名为www.blog.com,则需输入该域名。/static/当时,不论static之后是何页面,抑或是页面根本不存在,最终都会一致地导向www.abc.com这个网站。
针对所有以 "/documents/" 为起始的网址,一旦成功匹配,还需继续向下进行搜索。
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
location ~ /documents/Abc配置项为CC配置。
若地址以 "/images/" 为前缀,一旦匹配成功,即终止对正则表达式的进一步搜索,并采纳此规则。
location ^~ /images/ { [ configuration D ] }
6.# 匹配所有以 gif,jpg或jpeg 结尾的请求
然而,所有对/images/路径下的图片的请求都将由config D进行处理;这是因为正则表达式中的^~无法匹配到这一部分。
location ~* .(gif|jpg|对JPEG文件的处理需遵循配置E的要求。
例:
当#字符成功对应到/image/路径后,我们继续深入探索,会发现其中存在^~符号。
location /images/ { [ configuration F ] }
在最长字符匹配过程中,我们定位到了路径 /images/abc,若继续深入探索,便会发现存在符号 ^~。
# F与G的放置顺序是没有关系的
location /images/abc { [ configuration G ] }
仅当移除config D时方为有效:首先,需以最长匹配原则查找以config G开头的地址,随后,继续向下搜索,直至找到该正则表达式,并采纳之。
location ~ /images/abc/ { [ configuration H ] }
顺序 no优先级:
位置等于 > 位置的全路径 > 位置的正则匹配路径 > 位置的正则顺序 > 位置的部分起始路径 > 斜杠
上面的匹配结果:
按照上面的location写法,以下的匹配示例成立: / -> config A 精确完全匹配,即使/index.html也匹配不了 /downloads/download.html -> config B 匹配B以后,往下没有任何匹配,采用B /images/1.gif ->配置D与F相匹配,随后继续向下与D进行匹配,最终终止。/images/abc/def ->配置D最长匹配至G,继续向下匹配至D,操作即告终止。此时,你能够观察到所有以/images/起始部分都会与D相匹配后即终止,将FG置于此处并无实际价值,H则根本无法获得机会,此处的目的仅是为了阐述匹配的次序。/documents/document.html -> config C 匹配到C,往下没有任何匹配,采用C /documents/1.jpg ->配置E与C相吻合,继续向下进行正则表达式匹配,直至匹配到E。/documents/Abc.jpg ->配置CC时,最长匹配结果为C,随后按照正则表达式规则,紧接着进行CC的匹配,而不会继续向下匹配至E。
3、实际使用建议
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
直接针对网站的主页进行匹配,以域名方式访问网站首页的频率较高,采用这种方式可以提升处理速度,官方如此介绍。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则location = / { proxy_pass http://tomcat:8080/index 第二个必选规则涉及对静态文件请求的处理,这一功能正是nginx作为HTTP服务器的优势所在。
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ { root /webroot/static/; } location ~* .(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/第三条规则是通用的,其作用在于将动态请求转发至后端的应用服务器处理。
非静态文件请求通常被视为动态请求,这主要取决于实际情况。随着当前一些流行框架的广泛应用,文件后缀为.php或.jsp的情况已经变得较为罕见。
location / { proxy_pass http://tomcat:8080/ } http://淘宝网旗下的tengine项目,其相关书籍的第二章节内容,可以在此链接中查阅:http://tengine.taobao.org/book/chapter_02.html。 http://请勿对nginx.org/en/docs/http/ngx_http_rewrite_module.html进行修改。
二、关于Rewrite的用法概述 1. 对Rewrite这一概念进行阐释
URL的重写功能通过运用nginx所提供的全局变量或自定义变量,结合正则表达式及特定标志位,实现了对URL的重新定义和导向操作。
仅限将rewrite指令置于server{}和location{}块内部使用。if在指定范围内,且仅对域名部分进行限制,不包括传递的任何参数。以http:为例,限制仅针对域名本身。//seanlook.com/a/we/index.php?id=1&u=str 这一链接仅针对/a/we/index.php页面进行了特定的修改。
2.rewirte的 语法
rewrite regex replacement ;
当需要针对特定域名或参数字符串进行操作时,我们可以采取全局变量匹配的策略,或者运用proxy_pass反向代理功能。
观察表格可知,rewrite与location的功能存在相似之处,二者均具备页面跳转的能力。然而,二者之间仍存在显著差异:rewrite主要是在同一域名下对资源访问路径进行修改;而location则是对特定路径进行访问控制或反向代理处理,支持将请求通过proxy_pass指令转发至其他服务器。
在众多情形中,对位置信息的修改同样会包含“rewrite”字样,并且这些操作的执行次序为:
1 执行server块的rewrite指令 2 执行location匹配 3 执行选定的location中的rewrite指令
若某个URI阶段发生修改,需重新启动1至3的循环流程;此过程若执行超过10轮,系统将报出500内部服务器错误。
flag标志位
301和302状态码的返回,并不仅仅是提供一个简单的状态码,它们还需要包含重定向的URL,这就解释了为何return指令无法直接返回301或302状态码。
这里 last 和 break 区别有点难以理解:
通常情况下,last指令被置于server和if语句中,而break指令则常用于location语句。需要注意的是,last指令不会中断重写后的URL匹配过程,意味着新的URL将会再次经历server的匹配流程;相对地,break指令则会终止重写后的匹配。两者均能控制后续rewrite指令的执行。此外,rewrite指令中经常使用正则表达式。
正则表达式中,括号用于定义匹配模式,而()内匹配的内容可以在后续引用。特别需要注意的是,正则表达式中转义特殊字符时可能会引起混淆。
rewrite实例
例1:
http {
# 定义image日志格式
log_format imagelog ‘
$time_local
不允许对图像文件进行修改,必须保留其类型,传输的字节数需准确记录,同时状态信息亦须明确标示。
# 开启重写日志
rewrite_log on;
server {
root /home/www;
location / {
# 重写规则信息
错误日志记录于路径为logs/rewrite.log的文件中,并标记为通知级别。
# 注意这里要用‘’单引号引起来,避免{}
将表达式“^/images/({2})/({5})/(.*).(png|jpg|gif)$”修改为/data?file=$3.$4,其中,将图片路径的各部分分别提取出来,并替换为相应的文件名和格式。
请注意,在上述规则之后,不得添加“last”参数,否则后续的set命令将无法正常执行。
set $image_file $3;
set $image_type $4;
location /data {
# 指定针对图片的日志格式,来分析图片类型和大小
对访问日志进行记录,具体保存至“logs/images.log”文件,路径为“mian”。
root /data/images;
使用先前设定的变量,需先确认文件是否存在,若不存在,则进一步检查目录是否存在;若目录亦不存在,则需转向至最后的URL地址。
尝试加载/$arg_file,若失败则显示/image404.html页面。
location = /image404.html {
# 图片不存在返回特定的信息
返回404错误码,提示“图片未找到”。
对于类似/images/ef/uh7b3/test.png这样的请求,需要将其重写为/data?file=test.png,随后系统会定位到location /data。接着,系统会检查/data/images/test.png文件是否存在,若文件存在,则进行正常响应;若文件不存在,则将请求重定向到新的image404位置,并直接返回404状态码。
例2:
将重写后的URL模式设定为:禁止对图像资源进行修改云开·全站体育app登录,具体规则为:将原始路径中的文件名和尺寸信息提取出来,替换为/resizer/目录下的对应文件名,并附加查询参数来指定缩放尺寸,最后执行该操作。
对于类似/images/bla_500x400.jpg这样的文件请求,需要将其重定向至/resizer/bla.jpg?width=500&height=400的地址,同时系统还会持续尝试进行location的匹配。
if指令与全局变量
if判断指令语法
if (condition)
{…}
对设定的条件进行核实。若该条件成立,则将执行大括号中的重写指令。该条件(if条件)可包含以下任何一种情况:
当表达式仅作为变量存在,若其值为空或者以数字零开头的任何字符串,均会被视为假。在直接对比变量与内容时,应采取=或!= ~ 正则表达式匹配 ~* 不区分大小写的匹配 !~ 区分大小写的不匹配 -f和!-f 用来判断是否存在文件 -d和!-d 用来判断是否存在目录 -e和!-e 用来判断是否存在文件或目录 -x和!-x 用来判断文件是否可执行
例如:
如果用户设备为IE浏览器的时候,重定向
若检测到用户代理字符串中包含“MSIE”,则{
若检测到用户正在使用微软的IE浏览器,则终止该操作。
若用户代理中包含“MSIE”,则将请求重写至“/msid/”目录。
若检测到HTTP Cookie中包含“id=”后跟任意字符,直至遇到分号或字符串结束的符号。
set $id $1;
若cookie内容与预设的正则表达式相吻合,则将变量$id的值设为正则表达式所提取的部分。
if ($request_method = POST) {
return 405;
若采用POST方式进行数据提交,系统将响应以405状态码(表示方法不被允许),且不允许使用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){
将链接地址http://example.com/设置为永久禁止访问。
若查询字符串中含有“post=140”,则应实施对example.com的永久性跳转。
禁止访问以.gif、.jpg、.png、.swf或.flv结尾的文件。
拒绝接受无有效引用者,拦截以下域名:www.linuxidc.com,www.linuxmi.com;同时,对其他未列出的域名进行屏蔽处理。
if ($invalid_referer) {
return 404;
} //防盗链
全局变量
下面是可以用作if判断的全局变量
例:
请勿访问本地的88端口,具体路径为localhost下的test1目录中的test2子目录中的test.php文件。
$host:localhost
$server_port:88
请求的URI:位于本地主机,端口号为88,路径为/test1/test2/test.php
文档的路径为:/test1/test2/test.php,该地址被禁止修改。
$document_root:/var/www/html
请求的文件名为:/var/www/html/test1/test2/test.php,该路径指向了特定的PHP文件。

