nginx 配置 Rewrite, 并使URL不跳转

来自百度百科的介绍:Rewrite是一种服务器的重写技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术。它还可以实现限制特定IP访问网站的功能。很多情况下,某个 IP 的访问很容易造成 CPU 100% (比如 某些搜索引擎的固定抓取,别人大量的采集站点),这个时候我们就要利用一些有效的手段封掉对方的 IP,让他无法消耗服务器的资源,封 IP 的方法有很多种,如果你的 Web 服务器安装了 Rewrite 模块的话,也可以试试利用 Rewrite 规则封掉对方的 IP。说白了,就是让浏览器自动从一个URL跳转到另一个URL,也就是我们常说的 30*, 如:301永久重定向。

nginx 的rewrite规则采用了Pcre, perl兼容正则表达式的语法规则匹配,如果需要nginx的rewrite功能,在编译安装nginx之前,需要编译安装PCRE库。pcre和nginx安装,这里就不存介绍,如果有同学安装失败可以百度或留言。

rewrite 语法规则:

变量名:

变量名可以使用"="或"!="运算符

~  符号表示区分大小写字母匹配

~* 符号表示不区分大小写字母匹配

!~ 和 !~* 与~  !~* 相反

-f 和 !-f   用来判断文件是否存在

-d 和 !-d   用来判断目录是否存在

-e 和 !-e   用来判断文件或目录是否存在

-x 和 !-x   用来判断文件是否可以执行

也支持$1到$9位置参数

flag标记有:

1. last 相当于Apache里的[L]标记,表示完成rewrite

2. break 终止匹配, 不再匹配后面的规则

3. redirect 返回302临时重定向 地址栏会显示跳转后的地址

4. permanent 返回301永久重定向 地址栏会显示跳转后的地址

nginx内置全局变量

$args        请求中的参数;

$body_bytes_sent 已发送的消息体字节数

$content_length HTTP请求信息里的"Content-Length";

$content_type 请求信息里的"Content-Type";

$document_root  针对当前请求的根路径设置值;

$document_uri    与$uri相同; 比如 /test1/test2/test.php

$host        请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

$http_cookie             cookie 信息

$http_post             post 信息 

$http_user_agent       客户端代理信息

$http_x_forwarded_for   相当于网络访问路径。http://www.xxx.com/1335809.html

$nginx_version             nginx版本 

$query_string             与$args相同;

$remote_addr             客户端地址;

$remote_port             客户端端口号;

$remote_user             客户端用户名,认证用;

$request       用户请求

$request_filename     当前请求的文件路径名,比如$request_filename:D:\nginx/html/test1/test2/test.php

$request_method   请求的方法,比如"GET"、"POST"等;

$request_uri           请求的URI,带参数; 比如http://localhost:88/test1/test2/test.php

$server_addr       服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);

$server_name             请求到达的服务器名;

$server_port                 请求到达的服务器端口号;

$server_protocol        请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

$uri                 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

更多参数可以参考一下nginx手册

rewrite 实例:

实例1:

rewrite 可以放在 server\location\if 区内任何地方,如在 server 中添加:

rewrite ^/Goods/list/cid/(\d+)\.html http://www.xxx.com/list/$1.html last;

#表示所有的/Goods/list/cid/数字.html 都会跳转到 http://www.xxx.com/list/数字.html 地方,如:http://www.xxx.com/Goods/list/cid/1.html 会跳转到 http://www.xxx.com/list/1.html

实例2:根据不同的浏览器将得到不同的结果

if ($http_user_agent ~ Firefox) {  
    rewrite ^(.*)$ /firefox/$1 break;  
}  
if ($http_user_agent ~ MSIE) {  
    rewrite ^(.*)$ /msie/$1 break;  
}  
if ($http_user_agent ~ Chrome) {  
    rewrite ^(.*)$ /chrome/$1 break;  
}

但是,rewrite有一个不好的就是跳转之后,浏览器中的URL地址是变化的,如:实例1,当访问http://www.xxx.com/Goods/list/cid/1.html时,浏览器的地址栏会变成http://www.xxx.com/list/1.html, 我们怎么才能不让他变化呢,如果不想变化,这已经不是 rewrite 所能做的功能了,而应该是反向代理。nginx里有一个 proxy_pass 就是配置反向代理的。反向代理的参数很多,但是配置起来也很简单,同学们可以参考 nginx 中文文档,这里我只写一个实例说明一下怎么才能让 rewrite之后,URL地址不变。

location ~* ^/list/(\d+)\.html$ 
{
    rewrite ^/list/(\d+)\.html$ /Goods/list.html?cid=$1;
    proxy_pass http://www.xxx.com;
}

这个配置是放在 server 区域的。这个配置什么意思呢,就是所有的 /list/数字.html 请求,都会代理到 http://www.xxx.com/Goods/list.html?cid=数字,这个地址,如:用户访问 http://www.xxx.com/list/1.html,浏览器中的URL地址不变,但是用户拿到的数据确是 http://www.xxx.com/Goods/list.html?cid=1 这个地址返回的数据,至此我们想的rewrite后,地址不变却成功了。这样的话,我们可以把我们网站中的所有长连接都修改成很短的链接,简单明了,也很利于SEO。

未经允许不得转载:易读小屋  »  nginx 配置 Rewrite, 并使URL不跳转