一:nginx Rewrite 规则
1:rewrite的概念:
Nginx Rewrite功能是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向功能。Rewrite指令只能放在server {},location {},if {}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式)的语法进行规则匹配,如果需要Nginx的Rewrite功能,在编译安装Nginx之前,必须安装PCRE库。
例如: Rich Products Corporation | Global Food Supplier Serving Foodservice, In-Store Bakery, Retail & Industrial Markets 只对URL中的/a/we/index.php等字符串起作用。
URL是Uniform Resource Location的缩写,译为“统一资源定位符”
2:rewrite的语法:
rewrite 正则表达式 更换目标 [标志位]
rewrite和location功能有点像,都能实现跳转。主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对路径做控制访问或反向代理,可以使用proxy_pass代理到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
《1》:执行server块的rewrite指令
《2》:执行location匹配
《3》:执行选定的location中的rewrite指令
注意:如果其中某步URL被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 intelnal Server Error错误。
3:flag标志位
《1》:last:相当于Apache的[L]标记,表示完成rewrite。
《2》:break:本条规则匹配完成后,终止匹配,不再匹配后面的规则
《3》:redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
《4》:permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令
last和break用来实现URL重写,浏览器地址栏URL地址不变
redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址
4:if指令
语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(condition)可以是如下任何内容:
当表达式只是一个变量时,如果其值为空或任何以0开头的字符串都会当作条件为false
直接比较变量和内容时,使用=或!=
《1》:-f和!-f 用来判断是否存在文件
《2》:-d和!-d 用来判断是否存在目录
《3》:-e和!-e 用来判断是否存在文件或目录
《4》:-x和!-x 用来判断文件是否可执行
例如:http://www.a.com/a/b/test.html
If ($http_user_agent ~ MSIE) {
Rewrite ^(.*)$ /msie/$1 break;
} #如果UA包含“MSIE“,rewrite请求到/msie/目录下
If ($request_method = POST) {
Return 405;
} #如果提交方法为POST,则返回状态405(Method not allowed)。Return不能返回301,302
注意:因为返回301和302不能只返回状态码,还必须有重定向的URL,所以return指令无法返回301,302
If ($slow) {
Limit_rate 10k;
} #限速,$slow可以通过set指令设置
If (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
} #如果请求的文件名不存在,则反向代理到location。这里的break也是停止rewrite检查
If ($args ~ post=140) {
rewrite ^ Example Domain permanent;
} #如果query string中包含“post=140“,永久重定向到example.com
location ~* \.(gif | jpg | swf | flv)$ {
5:nginx变量
下面是可以用作if判断的变量
$args: 记录请求行中的参数,同$query_string
$content_length: 记录请求头中的Content-length字段。
$content_type: 记录请求头中的Content-Type字段。
$document_root: 记录当前请求在root指令中指定的值。
$host : 记录请求主机头字段,否则为服务器名称。
$http_user_agent: 记录用于记录客户端浏览器的相关信息
$http_cookie: 记录客户端cookie信息
$limit_rate: 记录可以限制连接速率。
$request_method: 记录客户端请求的动作,通常为GET或POST。
$request_filename: 记录当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : 记录HTTP方法(如http,https)。
$server_protocol: 记录请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 记录服务器地址,在完成一次系统调用后可以确定这个值。
$server_name: 记录服务器名称。
$server_port: 记录请求到达服务器的端口号。
$request_uri: 记录包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri: 记录不带请求参数的当前URI,$uri不包含主机名,如”http://www.a.com/foo/bar.php”。
$document_uri: 与$uri相同。
$http_x_forwarded_for 记录远程客户端的ip地址
$remote_addr: 记录远程客户端的IP地址。
$remote_port: 记录远程客户端的端口。
$remote_user 记录远程客户端用户名称
$time_local 记录访问时间及时区
$request 记录请求的URL与HTTP协议
$status 记录请求的状态,例如成功时为200,页面找不到时为404
$body_byte_sent 记录发送给客户端的文件主体内容大小
$http_referer 记录是从哪个页面链接访问过来的
安装nginx
《1》:rz 上传软件包
《2》: tar xf nginx-1.18.0.tar.gz -C /usr/src/ 解压
《3》:cd /usr/src/nginx-1.18.0/ 切换目录
《4》:yum -y install pcre-devel zlib-devel openssl-devel 安装依赖包
《5》:useradd -M -s /sbin/nologin nginx 创建用户
《6》 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-stream 编译安装
《7》:make && make install 编译安装
《8》:ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/ 创建链接
《9》:nginx -t 检查语法
实现域名跳转
《1》:编辑本机的hosts文件C:\Windows\System32\drives\etc\hosts
《2》:编辑的内容:
192.168.100.10 www.jd.com
192.168.100.10 www.360buy.com
《3》:vim /etc/hosts 编辑hosts文件
《4》:写入
192.168.100.10 www.jd.com
192.168.100.10 www.360buy.com
《5》:cd /usr/local/nginx/conf 切换目录
《6》:cp nginx.conf nginx.conf.bak 拷贝
《7》:vim nginx.conf 编辑文件
《8》:修改
server {
listen 80;
server_name www.jd.com;
charset utf-8;
root html;
index index.html index.htm;
if ($host = "www.360buy.com") {
rewrite ^(.*)$ ! permanent;
}
《9》:nginx 启动服务
《10》:netstat -lnpt |grep 80 查看端口
《11》:访问 www.360buy.com (注:他访问的是 www.360buy.com 跳转到 www.jd.com。)