Таким образом, я отодвигаю свой сайт от Apache и на Nginx, и я испытываю затруднения из-за этого сценария:
Пользователь загружает фотографию. Эта фотография изменена и затем скопирована в S3. Если существует подходящая комната на диске (или файл не может быть передан S3), локальная версия сохранена.
Я хочу, чтобы запросы на эти изображения (такие как http://www.mysite.com/p/1_1.jpg) сначала посмотрели в p/каталоге. Если никакой локальный файл не существует, я хочу проксировать запрос к S3 и представить изображение (но не перенаправление).
В Apache я сделал это как так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^p/([0-9]+_[0-9]+\.jpg)$ http://my_bucket.s3.amazonaws.com/$1 [P,L]
Моя попытка копировать это поведение в Nginx является этим:
location /p/ {
if (-e $request_filename) {
break;
}
proxy_pass http://my_bucket.s3.amazonaws.com/;
}
То, что происходит, - то, что каждый запрос пытается поразить Amazon S3, даже если файл существует на диске (и если он не существует на Amazon, я получаю ошибки.), Если я удаляю proxy_pass строку, затем запрашивает на файлы на диске, ДЕЙСТВИТЕЛЬНО работают.
Какие-либо идеи о том, как зафиксировать это?
Break
Разве не делает совсем то, что вы ожидаете, что nginx сделает последнее, что вы спрашиваете об этом, что имеет смысл, если вы начнете копаться вокруг модулей ... но в основном защищать свой Proxy_Pass с не существует версия
if (-f $request_filename) {
break;
}
if(!-f $request_filename)
proxy_pass http://s3;
}
Я закончил решить это, проверив, чтобы увидеть, не существует ли файл, и если да, переписывая этот запрос. Затем я справляюсь с повторным письменным запросом и выполнил прокси_пс там, например:
location /p/ {
if (!-f $request_filename) {
rewrite ^/p/(.*)$ /ps3/$1 last;
break;
}
}
location /ps3/ {
proxy_pass http://my_bucket.s3.amazonaws.com/;
}