9. Nginx Rewrite 功能

9. Nginx Rewrite 功能,第1张

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信息有以下几种:

#开启rewrite

RewriteEngine

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` 平滑重启即可生效。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/279031.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存