【问题标题】:What's the best way to rewrite a single character in NGINX?在 NGINX 中重写单个字符的最佳方法是什么?
【发布时间】:2016-07-18 14:29:36
【问题描述】:

我有一堆这样的网址:

http://domain.com/l/key-a=value-a/key-b=value-b.html

它们已被 Google 索引,但在我们的系统中已从 = 标志更改为 - 标志,因此我想将上述请求重定向到:

http://domain.com/l/key-a-value-a/key-b-value-b.html

注意:可能有一个或多个键值参数集,以上只是一个示例。

在 NGINX 中最好的方法是什么?

【问题讨论】:

  • 类似,唯一有问题的是它是一个“=”符号,并且可以在其他情况下使用。只有当参数以“/l/”路径为前缀时,我才需要重写它。你知道我该怎么做吗?
  • 路径是否只包含键值集?最大组数是多少? “key”是关键字还是占位符?

标签: regex nginx url-rewriting


【解决方案1】:

我可以使用以下代码块解决这个问题:

  location ~ /l/(.*)=(.*) {
    rewrite ^([^=]*)=(.*)$ $scheme://$host$1-$2;
    return 301;
  }

即使路径中有多个键值对段,这似乎也有效,例如:

domain.com/l/color=red/size=large/shape=round

更新:

我发现在存在多个键值段的情况下,会有多个 301 重定向,而 Google 不喜欢这样。

所以我最终选择了:

  location ~ /l/(.*)=(.*) {
    rewrite ^([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4-$5-$6-$7-$8-$9 permanent;
    rewrite ^([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4-$5-$6-$7-$8 permanent;
    rewrite ^([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4-$5-$6-$7 permanent;
    rewrite ^([^=]*)=([^=]*)=([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4-$5-$6 permanent;
    rewrite ^([^=]*)=([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4-$5 permanent;
    rewrite ^([^=]*)=([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3-$4 permanent;
    rewrite ^([^=]*)=([^=]*)=(.*)$ $scheme://$host$1-$2-$3 permanent;
    rewrite ^([^=]*)=(.*)$ $scheme://$host$1-$2 permanent;
  }

2s 的递减幂示例 (How to replace underscore to dash with Nginx) 对我不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2010-09-08
    • 2022-08-08
    • 2015-11-07
    • 2013-06-03
    • 2020-10-08
    • 2018-02-10
    相关资源
    最近更新 更多