nginx 0.7.65 重写不适用于双斜杠?

nginx 0.7.65 重写不适用于双斜杠?

使用 Nginx 0.7.65,我花了几个小时尝试让看似简单的 nginx 重写工作。但两个正斜杠似乎无法正常工作:

之前的网址:http://www.testme.com/uploads//image.jpg

之后的网址:http://www.testme.com/uploads/300/image.jpg

我在 nginx.conf 中使用了以下重写部分:

#try 1
location ~* \.jpg {
  (.*)//(image.jpg) $1/300/$2 permanent;
}

它不起作用。有什么想法可以让 nginx 重写正确地使用两个正斜杠吗?我尝试使用 // 转义斜杠,但这也没有任何帮助。我是否应该尝试更新到 nginx 0.8 并修复它?

我也尝试了这些(每个都单独尝试),但它们不起作用。我被重定向到 404 错误页面:

#try 2
location ~* \.jpg {
  rewrite "^(.*)([/]{2})image\.jpg$" $1/300/image.jpg permanent;
}

#try 3
location ~* \.jpg {
  rewrite (.+)//image\.jpg $1/300/image.jpg permanent;
}

#try 4
location ~* \.jpg {
  rewrite (.+)//(image.jpg) $1/300/$2 permanent;
}

答案1

原因是rewrite模块在解析请求时自动修剪了斜线。如果你查看错误日志,你会看到类似这样的内容:

[通知] 5883#0: 1 “(.+)//(image.jpg)”与“/uploads image.jpg”不匹配/,客户端:127.0.0.1,服务器:localhost,请求:“GET /uploads //image.jpg HTTP/1.1”,主机:“localhost”

不过,你可以使用$request_uri变量来保留从客户端收到的原始请求 URI:

    location ~* \.jpg {
        if ($request_uri ~ "(.+)\/\/(.+\.jpg)") {
            set $folder_uri $1;
            set $file_uri $2;
            rewrite .* $folder_uri/300/$file_uri permanent;
        }
    }

答案2

您的正则表达式似乎有误,因为只有 2 个捕获组。试试这个:

(.+)//(image.jpg) $1/300/$2

我还按照你的需要制作了 * a +某物位于斜线前面。

相关内容