Hello! On Sun, Dec 29, 2013 at 02:11:29PM +0400, Михаил Монашёв wrote:
> Здравствуйте, Maxim. > > >> Бага или фича? > >> > >> Если через WebDAV копируется несуществующий файл в существующей > >> директории, то выдаётся 404. Но если копируется файл из несуществующей > >> директории в неё же, то выдаётся 500 - Internal Server Error. Это > >> правильное поведение или должно 404 тоже выдаваться? > > > Если исходный файл/каталог не сущетсвует, то в любом случае должно > > выдаваться 404. > > >> Пример: > >> копируем http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg > >> в http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg.tmp > >> и получаем: 500 Internal Server Error > >> > >> в error_log-е: > >> 2013/12/28 11:54:28 [crit] 2845#0: *4749150 open() > >> "/opt2/beon/i39/17/74/1467417/47/avatars/4.jpeg.tmp" failed (2: No > >> such file or directory), client: 89.208.146.210, server: > >> i39.beon.ru, request: "COPY > >> http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg HTTP/1.1", host: > >> "i39.beon.ru" > >> > >> в access.log-e: > >> 28/Dec/2013:11:54:28 +0400 500 89.208.146.210 353 i39.beon.ru > >> "COPY http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg HTTP/1.1" > >> "-" "-" "-" "-" "-" "-" "close" > > > Должно быть так: > > > 2013/12/28 16:51:35 [error] 33014#0: *1 lstat() > > "/path/to/foo/bar/bazz" failed (2: No such file or directory), > > client: 127.0.0.1, server: , request: "COPY /foo/bar/bazz HTTP/1.1", > > host: "localhost" > > 127.0.0.1 - - [28/Dec/2013:16:51:35 +0400] "COPY /foo/bar/bazz HTTP/1.1" > > 404 168 "-" "-" > > > То, что у тебя сломался open(), намекает на то, что в процессе > > выполнения этого запроса кто-то удалил каталог. > > Каталоги там никто не удаляет точно. Вся работа идёт через nginx, а он > удалять каталоги не умеет и на встроенном перле у меня ничего не > написано. И ошибка эта воспроизводится не всегда. Вообще-то, nginx удалять каталоги умеет, нужно просто правильно попросить. Но это не твой случай, см. ниже. > Ошибка: Couldn't copy http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif => > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif.tmp: 500 Internal Server > Error > > Посмотрел debug-лог. Я там тоже накрутил с конфигом, но 500 всёравно > быть не должно ИМХО: [...] > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http request line: "COPY > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1" [...] > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http header: "Destination: > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif.tmp" [...] > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script regex: > "^(/\d+/\d+/\d+/)\d+/(avatars/.+|design/.+|0\.(?:gif|jpeg|png|mp3))$" > 2013/12/29 14:00:55 [notice] 78336#0: *10484311 > "^(/\d+/\d+/\d+/)\d+/(avatars/.+|design/.+|0\.(?:gif|jpeg|png|mp3))$" matches > "/43/96/1009643/43/avatars/9.gif", client: 89.208.146.210, server: > i41.beon.ru, request: "COPY > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: > "b.i41.beon.ru" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script copy: "/" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script capture: > "/43/96/1009643/" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script capture: > "avatars/9.gif" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script regex end > 2013/12/29 14:00:55 [notice] 78336#0: *10484311 rewritten data: > "//43/96/1009643/avatars/9.gif", args: "", client: 89.208.146.210, server: > i41.beon.ru, request: "COPY > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: > "b.i41.beon.ru" [...] > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http copy from: > "/opt2/beon/i41//43/96/1009643/avatars/9.gif" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http copy to: > "/opt2/beon/i41/43/96/1009643/43/avatars/9.gif.tmp" > 2013/12/29 14:00:55 [debug] 78336#0: *10484311 malloc: 0000000806E68000:65536 > 2013/12/29 14:00:55 [crit] 78336#0: *10484311 open() > "/opt2/beon/i41/43/96/1009643/43/avatars/9.gif.tmp" failed (2: No such file > or directory), client: 89.208.146.210, server: i41.beon.ru, request: "COPY > http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: > "b.i41.beon.ru" Из вышепроцитированного более или менее очевидно, что копируют существующий файл, однако в несуществующий каталог. Возврат 500 в подобной ситуации - не то чтобы лучшее из возможного, но как минимум объясним. IMHO, это классическая иллюстрация к соседнему треду про rewrite'ы. :) -- Maxim Dounin http://nginx.org/ _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru