Назад | Перейти на главную страницу

nginx 0.7.65 rewrite не работает для двойных слэшей?

Используя 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 +, как вы, наверное, хотите что-то быть перед косой чертой.