【问题标题】:redirect every other page to amp version except home page -nginx将除主页 -nginx 以外的所有其他页面重定向到 amp 版本
【发布时间】:2017-04-20 18:26:05
【问题描述】:

我正在尝试将我的所有移动用户重定向到网站的 amp 版本,但没有 amp 版本的主页除外。其他每个 amp 页面都在页面 uri 路径前添加了“/amp”前缀。 下面是我的 nginx 配置

if ($mobile_rewrite = perform) {
  rewrite ^(?!.*(/|/amp)) http://www.example.com/amp$request_uri? permanent;
  break;
}

我的意图是将任何路由重定向到除主页之外的 amp 版本。 重定向规则应为:

www.example.com ---> www.example.com

www.example.com/hollywood ---> www.example.com/amp/hollywood

www.example.com/article/abc ---> www.example.com/amp/article/abc

【问题讨论】:

  • 看起来您需要^(?!/?$) - 匹配所有进入正则表达式引擎的空输入或/ 输入。
  • 好的。我不太擅长正则表达式。我如何排除“/amp”和“/”。否则我会得到太多重定向。
  • 如果amp也应该被“排除”,也许你需要使用^(?!(?:/?$|(?:.*/)?amp(?:/|$)))
  • 请注意,正则表达式本身要么匹配字符串,要么不匹配,它不允许/排除/无论如何。 Nginx 将根据匹配或不匹配进行重定向。那么,应该匹配什么输入呢?
  • 每个接受主页的页面都应该重定向到 amp 页面。我需要将 '/amp' 与主页一起放在正则表达式忽略列表中,否则 nginx 将无限次重写导致“重定向过多”。除“主页”和“amp”页面外的所有页面都应匹配并允许

标签: regex redirect nginx


【解决方案1】:

你可以使用

^(?!/?$|(?:.*/)?amp(?:/|$))

here what kind of input it matches

详情

  • ^ - 字符串开头
  • (?!(?:/?$|(?:.*/)?amp(?:/|$))) - 如果前瞻模式匹配,则匹配失败的否定前瞻:
    • /?$|(?:.*/)?amp(?:/|$) - 两种选择之一:
      • /?$ - 一个可选的(出现 1 次或 0 次)/,然后是字符串的结尾 $
      • | - 或
      • (?:.*/)?amp(?:/|$) - 任意 0+ 字符的可选序列,直到最后一个 /(请参阅 (?:.*/)?),后跟 amp,后跟 / 或字符串结尾。

要添加条件以避免匹配 jscss 文件,请添加替代条件:

^(?!/?$|(?:.*/)?amp(?:/|$)|.*\.(?:js|css))
                           ^^^^^^^^^^^^^^  

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2016-11-30
    • 1970-01-01
    • 2020-03-11
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多