Nginx服务器利用ngx_http_rewrite_module模块解析和处理rewrite请求, 此功能依靠PCRE, 因此编译之前要安装PCRE库, rewrite是nginx服务器的重要功能之一, 用于实现URL的重写. URL的重写是非常有用的功能, 比如它可以在我们改变网站结构之后, 不需要客户端修改原来的书签, 也无需其他网站修改我们的链接, 就可以设置为访问, 另外还可以在一定程度上提高网站的安全性
用于条件匹配判断, 并根据条件判断结果, 选择不同的Nginx配置, 可以配置在server或location语句块中
Nginx的if语法仅能使用if做单次判断, 不支持使用if else或者if elif这样的多重判断, 用法如下:
使用正则表达式对变量进行匹配, 匹配成功时, if指令认为条件为true, 否则认为是false, 变量与表达式之间使用以下符号链接:
补充: 如果使用了if判断, 那么echo $变量必须放在if语句块才能生效
如果$变量的值为空字符串或者以0开头的任意字符串, 则if指令认为该条件为false, 其他条件为true
指定key并给其定义一个变量, 变量可以调用Nginx内置变量赋值给key, 另外set定义格式为set $key value
范例:
用于中断当前相同作用域(location, server, if)中的后续的rewrite模块中的指令, 一般用在location, 与该指令处于同一个作用域的Nginx中, 位于它前面的rewrite指令配置生效, 位于后面的 ngx_http_rewrite_module 模块中的指令就不再执行
return用于完成对请求的处理, 并直接向客户端返回响应状态码而非实际的页面内容, 同时, return前后的命令也都不会执行. 也就是只执行return命令 比如: 可以指定重定向URL(对于特殊重定向状态码, 301/302等)或者是指定提示文本内容(对于特殊状态码403/500等), 处于此指令后的所有Nginx配置都将不被执行, return可以在server, if和location语句块进行配置
return后可以接响应码, 直接返回给客户端, 也可以接响应码和提示信息, 返回给客户端, 或者接URL跳转, 通过301或者302跳转到其他链接
如果break和return同时出现, 那么return放在break后面时, 也不会执行, 因为return也属于rewrite的命令
由于没有做其他配置, 此时跳转会出现死循环, 第一次访问/时会跳转到https, 虽然跳转到了https, 但是仍然访问的是根, 又继续跳转, 进入死循环
详解: 第一次无论是访问http还是https, 由于都是访问的主站点/, 因此都会执行跳转到https, 跳转到https后, 仍然访问的是/, 因此会无限跳转, 直到超过跳转次数. 需要配置if条件, 来进行判断, 如果访问的是https, 那么就不跳转, 稍后演示
设置是否开启记录ngx_http_rewrite_module 模块日志记录到error_log日志文件当中, 可以配置在http, server, location或者if中
记录的是rewrite出现的错误日志
注意: 需要日志级别设定为notice
通过正则表达式的匹配来改变URI, 可以同时存在一个或多个指令, 按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者URI做具体处理
rewrite可以匹配在server, location, if语句块中
语法格式:
rewrite将用户请求的URI基于regex所描述的模式进行检查, 如果匹配, 会将URI替换为其表达式指定的新的URI
注意: 如果在同一级别配置块中, 存在多个rewrite规则, 那么会自上而下逐个检查, 被某条件规则替换完成后, 会重新一轮的替换检查, 隐含循环机制, 但不会循环超过10次, 如果超过, 会提示500响应码, [flag]所表示的标志位用于控制此循环机制
如果替换后的URL是以http://或者https://开头, 则替换结果会直接以重定向返回给客户端, 即永久重定向301
正则表达式格式:
利用nginx的rewrite的指令, 可以实现url的重新跳转, rewrite有四种不同的flag, 分别是redirect(临时重定向), permanent(永久重定向), break和last.
其中, 前两种是跳转型的flag, 后两种是代理型, 跳转型指由客户端浏览器重新对新地址进行请求, 代理型是WEB服务器内部实现跳转
域名的临时调整, 后期可能会发生变化, 之前的域名或者URL可能还会使用, 或者跳转的目地域名和URL还会跳转, 这种情况下浏览器不会缓存跳转, 临时重定向不会缓存域名解析A记录, 而永久重定向会缓存
域名永久型调整, 即域名永远跳转至另一个新的域名, 之前的域名再也不使用, 跳转记录可以缓存到客户端浏览器
永久重定向会缓存DNS解析记录, 浏览器中请求报文头部会有 from disk cache 信息
域名临时重定向, 告诉浏览器域名不是固定重定向到当前目标域名, 后期可能随时会更改, 因此浏览器不会缓存当前域名的解析记录, 而浏览器会缓存永久重定向的DNS解析记录, 这也是临时重定向与永久重定向最大的本质区别
注意: 如果访问的是 http://pc.wang.org/break , 那么会显示new test111, 也就是rewrite到test1后继续到test1的location进行匹配执行
break适用于不改变客户端访问方式, 但是要将访问的目的URL做单次重写的场景, 比如: 有v1/v2两个版本的网站前端页面并存, 旧版本的网站数据在staticv1, 还不能丢失, 但是要将访问旧版本的请求重写到新的静态资源路径staticv2
last: 对某个location的URL匹配成功后, 会停止当前location的后续rewrite规则, 并结束当前location, 然后将匹配生成的新的URL跳转至其他location继续匹配, 直到没有location可以匹配, 将最后一次location的数据返回给客户端
last适用于不改变客户端访问方式, 但是要求多次目的URL重写的场景, 使用场景不是很多
无论是使用return 还是 rewrite https, 都会出现死循环跳转, 导致页面无法访问的情况, 因此, 需要配合if条件判断, 防止死循环
防盗链基于客户端请求报文携带的referer字段实现, referer是记录打开一个页面之前, 记录是从哪个页面跳转过来的标记信息, 如果别人只链接了其他网站的图片或者某个单独的资源, 而不是打开了整个网站页面, 那么就是盗链, referer字段显示的就是跳转之前的网站的域名, 正常的referer信息有以下几种:
#开启rewriteRewriteEngine
On
#判断,如果访问的域名不是
www.domain.com
,后面的[NC]代表不区分大小写
RewriteCond
%{http_host}
!^www\.domain\.com$
[NC]
#将所有的访问进行301转跳到
www.domain.com
下,其中R=301代表是301转跳,L代表重写规则结束
RewriteRule
^(.*)$
http://www.domain.com/$1
[R=301,L]
如果你的站点用了伪静态,rewrite
rule要先做转跳,再做伪静态
具体方法如下:
1、在/usr/local/nginx/conf/nginx.conf文件末尾加入虚拟主机配置,实例如下:
server{
listen 80
server_name http://www.hebaodans.com
index index.html index.htm index.php
root /wwwroot/www.hebaodans.com
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock
fastcgi_pass 127.0.0.1:9000
fastcgi_index index.php
include fcgi.conf
}
#include rewite rule file or you can directly write here
include rewrite.conf
log_format hebaodanscom ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’
access_log /logs/hebaodanscom.log hebaodanscom
}
2、vi /usr/local/nginx/conf/rewrite.conf 输入以下规则:
location / {
if (!-e $request_filename)
{
#————START —————WORLDPRESS————
rewrite ^ /index.php last
#————END —————WORLDPRESS————
#————————zen-cart start——————
# From Ultimate SEO URLs
rewrite "^(.*)-p-(.*).html" /index.php?main_page=product_info&products_id=$2&% last
rewrite "^(.*)-c-(.*).html" /index.php?main_page=index&cPath=$2&% last
rewrite "^(.*)-m-([0-9]+).html" /index.php?main_page=index&manufacturers_id=$2&% last
rewrite "^(.*)-pi-([0-9]+).html" /index.php?main_page=popup_image&pID=$2&% last
rewrite "^(.*)-pr-([0-9]+).html" /index.php?main_page=product_reviews&products_id=$2&% last
rewrite "^(.*)-pri-([0-9]+).html" /index.php?main_page=product_reviews_info&products_id=$2&% last
# For Open Operations Info Manager
rewrite "^(.*)-i-([0-9]+).html" /index.php?main_page=info_manager&pages_id=$2&% last
# For dreamscape’s News & Articles Manager
rewrite "^news/?" /index.php?main_page=news&% last
rewrite "^news/rss.xml" /index.php?main_page=news_rss&% last
rewrite "^news/archive/?" /index.php?main_page=news_archive&% last
rewrite "^news/([0-9]{4})-([0-9]{2})-([0-9]{2}).html" /index.php?main_page=news&date=$1-$2-$3&% last
rewrite "^news/archive/([0-9]{4})-([0-9]{2}).html" /index.php?main_page=news_archive&date=$1-$2&% last
rewrite "^news/(.*)-a-([0-9]+)-comments.html" /index.php?main_page=news_comments&article_id=$2&% last
rewrite "^news/(.*)-a-([0-9]+).html" /index.php?main_page=news_article&article_id=$2&% last
# All other pages
# Don’t rewrite real files or directories
#RewriteCond %{REQUEST_FILENAME} !-f [NC]
#RewriteCond %{REQUEST_FILENAME} !-d
rewrite "^(.*).html" /index.php?main_page=$1&% last
#—————————-zen-cart end—————–
}
}
保存后,运行 kill -HUP `cat /usr/local/nginx/nginx.pid` 平滑重启即可生效。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)