所以我将我的网站从 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 行,则对磁盘上文件的请求会起作用.
有想法该怎么解决这个吗?
最佳答案
这不应该是使用 try_files
的示例吗? ?
location /p/ {
try_files $uri @s3;
}
location @s3{
proxy_pass http://my_bucket.s3.amazonaws.com;
}
确保 S3 url 上没有以下斜杠
关于proxy - Nginx 代理到本地磁盘或 S3 上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045869/