本文提供一些常用的rewrite重写规则,用来美化网页的链接。规则里面的$1$2你不知道是怎么来的话,只要记住,第一个()里面的是$1,第二个()里面的是$2.

请求的URL是给人看的,重写后的URL是给电脑看的。

执行搜索

这个规则的目的是为了执行搜索,搜索URL中包含的关键字。

请求的URL //hqidi.com/search/some-search-keywords
重写后URL //hqidi.com/search.php"color: #ff0000">nginx rewrite指令执行顺序

1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
2.执行location匹配
3.执行选定的location中的rewrite指令

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件。

如果循环超过10次,则返回500 Internal Server Error错误。

flag标志位

rewrite的语法很简单,如:

rewrite regex URL [flag];

rewrite是关键字,regex是正则表达式,URL是要替代的内容,[flag]是标记位的意思,它有以下几种值:

  • last: 相当于Apache的[L]标记,表示完成rewrite
  • break: 停止执行当前虚拟主机的后续rewrite指令集
  • redirect: 返回302临时重定向,地址栏会显示跳转后的地址
  • permanent: 返回301永久重定向,地址栏会显示跳转后的地址

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

  • last一般写在server和if中,而break一般使用在location中
  • last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  • break和last都能组织继续执行后面的rewrite指令

来看一个简单实例:

rewrite ^/listings/(.*)$ /listing.html"htmlcode">
if ($http_user_agent ~ MSIE) {
  rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下
 
if ($http_cookie ~* "id=([^;]+)(") {
  set $id $1;
 } //如果cookie匹配正则,设置变量$id等于正则引用部分
 
if ($request_method = POST) {
  return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回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){
  rewrite ^ http://mysite.com/ permanent;
} //如果query string中包含"post=140",永久重定向到mysite.com

if指令中,可以使用全局变量,这些变量有:

  • $args: #这个变量等于请求行中的参数,同$query_string
  • $content_length: 请求头中的Content-length字段。
  • $content_type: 请求头中的Content-Type字段。
  • $document_root: 当前请求在root指令中指定的值。
  • $host: 请求主机头字段,否则为服务器名称。
  • $http_user_agent: 客户端agent信息
  • $http_cookie: 客户端cookie信息
  • $limit_rate: 这个变量可以限制连接速率。
  • $request_method: 客户端请求的动作,通常为GET或POST。
  • $remote_addr: 客户端的IP地址。
  • $remote_port: 客户端的端口。
  • $remote_user: 已经经过Auth Basic Module验证的用户名。
  • $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"htmlcode">
    rewrite ^ $scheme://www.mysite.com$request_uri permanent;

    当访问任意url都会301永久定向到www.mysite.com的url上。这个写法没错,但是因为使用了rewrite的正则匹配,会损耗一部分资源,nginx官网不推荐这样写。我们可以使用return同样可以实现301跳转,简单实用,看实例:

    301永久定向到新域名

    server {
      listen 80;
      listen 443 ssl;
      server_name www.old-name.com old-name.com;
      return 301 $scheme://www.new-name.com;
    }
    

    以上代码实现了老域名301跳转到新域名上,假如网站要更换新域名的话使用此方法做301跳转。

    不带www的域名301跳转到带www的域名

    server {
      listen 80;
      listen 443 ssl;
      server_name mysite.com;
      return 301 $scheme://www.mysite.com$request_uri;
    }
    

    http站点301跳转到https站点

    server {
      listen 80;
      server_name www.mysite.com;
      return 301 https://www.mysite.com$request_uri;
    }
    

    以上就是有关Nginx的rewrite重写与重定向的介绍,觉得有用就请练习多遍,收藏好此文不迷路。也希望大家多多支持。

标签:
nginx,rewrite重写规则,nginx,rewrite,重写

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
评论“详解常用的nginx rewrite重写规则”
暂无“详解常用的nginx rewrite重写规则”评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。