从亚马逊 s3 存储桶中检索静态文件
Retrieve static file from amazom s3 bucket
我试图以这样一种方式配置我的 nginx,每当出现一些错误的网关响应时,我都会尝试从 s3 存储桶中获取静态 html 内容。
请求的url结构是some_bucket/folder1/folder2/text
数据存储在s3 bucket中,目录结构为s3.amazonaws.com/some_bucket/folder1/folder2/folder1_folder2.html
我无法确定 folder1 和 folder2 的值,因此我无法
html 动态文件并使用 proxy_pass。
另外,我试过 try_files 但我认为这对 url 不起作用。
知道如何解决这个问题。
谢谢。
Nginx S3代理可以处理动态构建URL,还可以隐藏一个目录甚至部分私有URL比如AWS Key:
例如基础URL如下:
结果URL:
https://your_server/proxy_private_file/readme.txt?st=sagw4gsafdhsd&e=3453445231
配置不难:
location ~* ^/proxy_private_file/(.*) {
set $s3_bucket 'your_bucket.s3.amazonaws.com';
set $aws_access_key 'AWSAccessKeyId=YOUR_ONLY_ACCESS_KEY';
set $url_expires 'Expires=$arg_e';
set $url_signature 'Signature=$arg_st';
set $url_full '?$aws_access_key&$url_expires&$url_signature';
proxy_http_version 1.1;
proxy_set_header Host $s3_bucket;
proxy_set_header Authorization '';
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
proxy_ignore_headers "Set-Cookie";
proxy_buffering off;
proxy_intercept_errors on;
proxy_pass http://$s3_bucket/$url_full;
}
有关详细信息,请参阅 full configuration。
这是我为可能遇到此问题的人(可能是新手)所做的。
location ~* ^/some_bucket/(.*)/(.*)/.* {
proxy_pass http://s3.amazonaws.com/some_bucket///_.html;
}
~* 表示不区分大小写的正则表达式匹配
^ 之前的意思
() 用于捕获参数。
例如,
用户输入 www.example.com/some_bucket/folder1/folder2/text
然后,处理为,
~* 确保不区分大小写的搜索(对于区分大小写的跳过 *(意味着只输入 ~))
^ 匹配 www.example.com.
然后匹配/some_bucket/,
.* 表示任意数量的任意字符(对于任意数字,替换为 [0-9]*)
() 确保捕获匹配的值
所以,$1 捕获文件夹 1
$2 捕获文件夹2
然后
.* 不带括号匹配任何字符但不捕获匹配值
现在可以使用捕获的值在亚马逊存储桶中使用
查找文件
proxy_pass http://s3.amazonaws.com/some_bucket/$1/$2/$1_$2.html
我试图以这样一种方式配置我的 nginx,每当出现一些错误的网关响应时,我都会尝试从 s3 存储桶中获取静态 html 内容。
请求的url结构是some_bucket/folder1/folder2/text
数据存储在s3 bucket中,目录结构为s3.amazonaws.com/some_bucket/folder1/folder2/folder1_folder2.html
我无法确定 folder1 和 folder2 的值,因此我无法 html 动态文件并使用 proxy_pass。 另外,我试过 try_files 但我认为这对 url 不起作用。
知道如何解决这个问题。
谢谢。
Nginx S3代理可以处理动态构建URL,还可以隐藏一个目录甚至部分私有URL比如AWS Key:
例如基础URL如下:
结果URL:
https://your_server/proxy_private_file/readme.txt?st=sagw4gsafdhsd&e=3453445231
配置不难:
location ~* ^/proxy_private_file/(.*) {
set $s3_bucket 'your_bucket.s3.amazonaws.com';
set $aws_access_key 'AWSAccessKeyId=YOUR_ONLY_ACCESS_KEY';
set $url_expires 'Expires=$arg_e';
set $url_signature 'Signature=$arg_st';
set $url_full '?$aws_access_key&$url_expires&$url_signature';
proxy_http_version 1.1;
proxy_set_header Host $s3_bucket;
proxy_set_header Authorization '';
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
proxy_ignore_headers "Set-Cookie";
proxy_buffering off;
proxy_intercept_errors on;
proxy_pass http://$s3_bucket/$url_full;
}
有关详细信息,请参阅 full configuration。
这是我为可能遇到此问题的人(可能是新手)所做的。
location ~* ^/some_bucket/(.*)/(.*)/.* {
proxy_pass http://s3.amazonaws.com/some_bucket///_.html;
}
~* 表示不区分大小写的正则表达式匹配 ^ 之前的意思 () 用于捕获参数。
例如, 用户输入 www.example.com/some_bucket/folder1/folder2/text
然后,处理为,
~* 确保不区分大小写的搜索(对于区分大小写的跳过 *(意味着只输入 ~))
^ 匹配 www.example.com.
然后匹配/some_bucket/,
.* 表示任意数量的任意字符(对于任意数字,替换为 [0-9]*)
() 确保捕获匹配的值
所以,$1 捕获文件夹 1
$2 捕获文件夹2
然后
.* 不带括号匹配任何字符但不捕获匹配值
现在可以使用捕获的值在亚马逊存储桶中使用
查找文件proxy_pass http://s3.amazonaws.com/some_bucket/$1/$2/$1_$2.html