【问题标题】:Nginx rewrite that includes a blank spce包含空格的 Nginx 重写
【发布时间】:2017-07-21 19:57:33
【问题描述】:

我们的一个客户创建了一个二维码,该二维码在 URL 中包含一个空格。 我将如何编写处理此问题的 nginx 重定向?

尝试在字符串中使用“%20”之类的内容似乎会导致 nginx 出错或配置测试失败

准确地说,二维码是这样的

http://www.google.com/somestuff /someotherstuf/pagewewant

我需要将其重定向到

http://www.google.com/somestuff/someotherstuf/pagewewant (重写后应该没有空格)

感谢您的宝贵时间

【问题讨论】:

  • 你的意思是重写 "/somestuff " /somestuff break;不工作?
  • 你能用你当前的重写发布你的 nginx 配置吗?

标签: nginx rewrite


【解决方案1】:

问题已经超过两年了,但也许它会让人头疼。

警告:我不是 nginx 专家。这只是我在找到这个悬而未决的问题后尝试的事情之一,而且它碰巧奏效了。这可能不是最好的方法。我建议检查 nginx 文档,以防有人正在处理大量此类位置。

对于包含空格的偶尔重写,我将路径放在单引号中:

location '/level_one /landingpage.htm' { 
rewrite ^ http://www.foo.bar/level_one/landingpage.htm permanent; }

如果由于某种原因您需要在目标中包含空格,请将其放在单引号中:

location '/downloads/foo bar.pdf' { 
rewrite ^ 'http://www.foo.bar/documents/foo bar.pdf' permanent; }

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。 你不能使用 %20 的原因是,nginx 会解释 uri,所以 %20 不会匹配:

    http request line: "GET /something/%20something HTTP/1.1"
    http uri: "/something/ something"
    

    我不想为此使用位置,所以我使用了:

    rewrite ^/something/\ something /something/something permanent;
    

    这对我来说效果很好。

    【讨论】:

      【解决方案3】:

      如果您想从 URL 中删除空格,然后重定向到没有空格的剥离 URL,只需使用以下命令来捕获所有有问题的 URL:

      rewrite ^(.*)(\s|%20)(.*)$ $1$3 permanent;
      

      这基本上是在捕获组 1 ($1) 中第一次出现空格 \s 或 URL 编码空格 %20 之前抓取所有内容。然后在第 2 组 ($2) 中捕获空间。然后最后在第 2 组中剩下的任何东西都被捕获到第 3 组 ($3)。然后我将捕获组 1 和 3 连接在一起 ($1$3) 以形成重定向 URL,而捕获组 2 ($2) 中没有空格。

      这适用于在整个 URL 中包含多个空格的 URL,但它一次只能使用一个。因此,其中包含 2 个空格的 URL,然后将重定向到具有 1 个空格的 URL,然后最终重定向到没有空格的 URL。

      如果您愿意,您当然可以将重定向类型从永久更改。这目前将使用 301 代码重定向。

      【讨论】:

      • rewrite ^(.*)(\s|%20)+(.*)$ $1$3 permanent; 好一点
      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2011-11-20
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多