【问题标题】:Nginx Rewrite rule to replace '?' with %3fNginx 重写规则以替换“?”与 %3f
【发布时间】:2012-10-05 16:13:53
【问题描述】:

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

所有包含“?”的网址即使文件实际存在,也会产生 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?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    你应该url-encode你的查询字符串来转义特殊字符,例如?=

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

    foo%3Flang%3Dar.html 
    

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

    【讨论】:

    • 是的,问题是如何配置 nginx 以这种方式重定向/重写请求(问题改写为更清楚)
    【解决方案2】:

    在对 nginx 进行 http 调用之前,您必须将 ? 编码为 %3F

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

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2014-10-24
      • 2014-06-30
      • 2016-08-09
      • 2012-02-27
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多