Используя Nginx 0.7.65, я потратил несколько часов, пытаясь заставить работать то, что казалось простым переписыванием nginx. Но две косые черты, похоже, не работают должным образом:
URL до: http://www.testme.com/uploads//image.jpg
URL после: 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;
}
Причина в том 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 группы захвата. Попробуй это:
(.+)//(image.jpg) $1/300/$2
Я также сделал * a +, как вы, наверное, хотите что-то быть перед косой чертой.