包含空格的Nginx重写

时间:2012-08-24 00:11:09

标签: nginx rewrite

我们的客户创建了一个二维码,其中包含一个空白区域。 我如何编写处理此问题的nginx重定向?

在字符串中使用诸如“%20”之类的一些尝试似乎会导致nginx错误或者使configtest失败

准确地说,QR码读起来像这样

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

我需要重新指导

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

感谢您的时间

3 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:2)

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

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

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

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

这对我来说很好。

答案 2 :(得分:1)

如果您想从网址中删除空格,然后重定向到没有空格的已剥离网址,只需使用以下内容来捕获所有包含此问题的网址:

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

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

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

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