2

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

所有包含“?”的 URL 即使文件实际存在,也会产生 404。例如

> 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?

4

2 回答 2

1

您应该对查询字符串进行url 编码以转义特殊字符,例如?=

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

foo%3Flang%3Dar.html 

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

于 2012-10-05T16:17:32.133 回答
1

?您必须像%3F在对 nginx 的 http 调用之前一样编码。

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

于 2012-10-05T17:31:27.120 回答