使用 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 +某物位于斜线前面。