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?
答案 0 :(得分:1)
您应该url-encode查询字符串以转义特殊字符,例如?
和=
具体来说,一旦编码,您必须请求的文件名称为:
foo%3Flang%3Dar.html
在Javascript中,您可以使用encodeURIComponent()
函数对文件名进行网址编码,在PHP中您有urlencode()
。
答案 1 :(得分:1)
在http调用nginx之前,你必须将?
编码为%3F
。
原因是url rfc将?
字符保留为特殊字符(具体请参见第3.3节)。因此,nginx会正确地将未转义的?
字符解释为URL的路径部分的结尾