5

我们的一个客户创建了一个 QR 码,其中 url 中有一个空格。我将如何编写处理此问题的 nginx 重定向?

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

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

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

我需要将其重新定向到

http://www.google.com/somestuff/someotherstuf/pagewewant (重写后 somestuff 不应显示空白)

谢谢你的时间

4

3 回答 3

4

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

警告词:我不是 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; }
于 2015-01-19T09:25:18.640 回答
3

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

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

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

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

这对我来说很好。

于 2016-09-29T13:10:54.457 回答
2

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

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

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

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

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

于 2017-07-21T11:57:33.420 回答