Nginx重写规则取代'?'与%3f

时间:2012-10-05 16:13:53

标签: nginx

Nginx只提供静态文件,但有些文件名包含“?”。是的,问号。

包含'?'的所有网址即使文件实际存在,也会产生404。 e.g。

> GET /foo?lang=ar.html HTTP/1.1
...
...
< HTTP/1.1 404 Not Found

虽然名为 foo?lang = ar.html 的文件确实存在于预期的位置。

> GET /foo%3flang=ar.html HTTP/1.1
...
...
< HTTP/1.1 200 OK

如何编写重写指令以便所有'?'将被重定向到%3f?

2 个答案:

答案 0 :(得分:1)

您应该url-encode查询字符串以转义特殊字符,例如?=

具体来说,一旦编码,您必须请求的文件名称为:

foo%3Flang%3Dar.html 

在Javascript中,您可以使用encodeURIComponent()函数对文件名进行网址编码,在PHP中您有urlencode()

答案 1 :(得分:1)

在http调用nginx之前,你必须将?编码为%3F

原因是url rfc?字符保留为特殊字符(具体请参见第3.3节)。因此,nginx会正确地将未转义的?字符解释为URL的路径部分的结尾