前提:只适合自己的服务器,自己拥有修改nginx的权限,第三方服务器的修改无效。

起因:因为自己服务器上部署的blog程序一直在换,zblog,wellcms,typecho和现在的wordpress,还有litepress,测试的时候又一直在换二级域名,结果导致一些朋友圈当初链接的地址在二级域名更换后,无法访问。原因就是链接的地址已经失效了。e.g. 当初发布朋友圈的链接地址为: http://www.abc.com/?id=23,后来因为二级域名更换,比如现在更换为了http://blog.abc.com/,当初那个链接的内容还在,不过现在的地址已经变成了:http://blog.abc.com/?p=23,那么原地址已经失效,新地址又无法在朋友圈中编辑。这篇文章的目的就是解决这种情况的。

前提:宝塔后台+nginx修改配置,同时拥有www.abc.com的服务器后台权限。因为没有权限你也没办法去修改nginx配置。

目标:将http://www.abc.com/?id=23 访问自动引导至:http://blog.abc.com/?p=23

步骤:

1、登陆宝塔后台,进入网站 http://www.abc.com 的设置中,在左侧的配置中找到:


server
{
    listen 80;
    server_name www.abc.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.abc.com;
...

往后到location段落后面插入一段if判断:

    #?id=xxx跳转到blog.abc.com/?p=xxx
    if ( $args ~ "^(id=)(.*)$")
    {
      set $tmpvalone $2;
      rewrite ^(.*)$  http://blog.ilaoyao.cn/?p=$tmpvalone redirect;
    }
    

2、保存后生效。

3、逐句解释(备忘)

#表示注释

if ( $args ~ "^(id=)(.*)$"),//$args为nginx内置变量,表示地址中的参数,如本例中为:id=23,更多的内置变量可以搜索【nginx 内置变量】查看更多。~ 表示不区分大小写,后面^(id=)(.*)$ 为正则表达是,括号为子表达式,第一个括号变量就是$1,第二个括号内的就是$2,可以在后面直接引用。这个正则表达式的表示id=xxx(xxx为数字,本例子中因为后面都是数字,所以用.*表示了全部字符也是可以的),需要截取的是$2这个内容。

补充一个:"^(.\id=)([0-9]{1,5})(.)$",可以设置3个变量,第一个表示查找至id=,第二个表示最少1个最长5位的数字,第三个表示&之后的全部字符,本例子中取的就是$2

set $tmpvalone $2; 将$2赋值给一个临时变量,因为我测试的时候如果不赋值,后面再进行正则表达式的时候,$2就没有了。

rewrite ^(.*)$ http://blog.ilaoyao.cn/?p=$tmpvalone redirect; //rewrite是重写,前面^(.*)$表示所有字符,在此段中貌似应该是当前url的完整链接地址。这一个地方似乎还没有弄明白;http://blog.ilaoyao.cn/?p=$tmpvalone表示将前面的地址修改为后面这个地址,这个地址不需要用正则,可以看到是直接将$tmpvalone添加到新地址后面,实现跳转。redirect表示参数,临时跳转。还有参数为:permanent表示永久跳转,自己测试了一下,没什么大区别,可能跟缓存还有区别吧。未测试。

这样就再访问的时候就实现了跳转到新地址。

4、备注:

1)如果其他失效的地址不是80端口,比如88端口,那么在上面的listen 80 修改为88(有时候子目录的二级域名会自动使用定义域名的端口,无法修改。)

2)如果地址是其他类型的话,方式也是一样,就是通过用多个子表达式,获取我们所需要的那个变量,用一个中间变量临时过渡后,赋值到新的地址字符串上面。

3)正则表达式介绍地址:https://www.runoob.com/regexp/regexp-syntax.html

4)正则表达式测试地址:https://c.runoob.com/front-end/854/

5)nginx内置变量参考页面:https://www.cnblogs.com/larry-luo/p/10119842.html

5、补充:测试地址:http://www.ilaoyao.cn/?id=156 自己测试的时候,页面是成功的,当然我个人服务器的地址比较单一,实际上我测试到跳转到的完整地址是:http://blog.ilaoyao.cn/?p=156&id=156这样的,虽然不影响使用,但是后面多出了一块&id=156,这个应该还是上面那个rewrite中出现了问题,后期继续研究再说~