在nginx位置指令中,我如何匹配s3的url。
例如,错误的url是:
http://example.com/https://s3.amazonaws.com/mybucket/logo.jpg?1404251306
从日志,我可以看到nginx能够从这个url服务请求,并返回一个404。
xx.xx.xx.xx - - [15/Aug/2014:12:38:04 +0000] "GET /https://s3.amazonaws.com/mybucket/logo.jpg HTTP/1.1" 404 151 "-" "Mo
有了这个,我想匹配这个url,将请求代理到s3并返回logo.jpg 。 我已经想出了这样的事情:
location ~* ^/https/(.*) { set $s3_host 's3.amazonaws.com'; set $s3_bucket 'mybucket'; proxy_set_header Host $s3_host; 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; resolver 8.8.8.8 valid=300s; resolver_timeout 10s; proxy_pass http://$1; }
问题 :
我得到以下错误:
==> /var/log/nginx/error.log <== 2014/08/15 13:53:08 [error] 1579#0: *1 invalid port in upstream ":/s3.amazonaws.com/mybucket/logo.jpg", client: xx.xx.xx.xx, server: localhost, request: "GET /https://s3.amazonaws.com//mybucket/logo.jpg HTTP/1.1", host: "54.164.92.206"
编辑:(1)对不起,这里有一些错字(2)我调整正则expression式,所以它匹配一个或多个斜杠之前像上面的日志stringmybucket 。
好吧,也许你的意思是这样的
location ~* ^/https://s3\.amazonaws\.com/+mybucket(.*) { ... proxy_pass http://s3.amazonaws.com/mybucket$1; }
我碰到这个错误,这是因为我设置了Host头错误。
这是最后工作的configuration:
set $s3_bucket 's3-us-west-1.amazonaws.com'; ... proxy_set_header Host $s3_bucket;
请注意,主机头不包含http / https。 这应该包含在proxy_pass行中
proxy_pass http://$s3_bucket/whatever