我们使用Amazon S3存储来托管图像及其缩略图。我们上传没有缩略图的新图像以按需生成。为此,我们使用S3重写规则,如下所示:
<RoutingRules>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<HostName>mysite.com</HostName>
<ReplaceKeyPrefixWith>/path/to/thumbnail/generator.php?image=</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>
如果一个缩略图还不存在,它将被重定向到我们的脚本,脚本生成一个新的缩略图,上传到S3并在响应中发送它。脚本工作良好,并做了我们需要的。问题是,如果S3桶中已经有缩略图可用,那么对新生成的缩略图的所有next调用都会一次又一次地重定向到脚本事件。
如何阻止"下一个重定向"?
S3中路由规则返回的默认http状态显示为301 Moved Permanently
。当看到这段代码时,浏览器应该为后续请求使用新位置…因此,鉴于此,你所看到的行为并非完全出乎意料。
一个"临时"重定向,如你正在做的应该返回302 Found
(技术上,302
是唯一重要的部分,一些实现将使用302 Moved Temporarily
或其他消息)。使用这样的重定向,浏览器应该将未来的请求发送到原始位置。
使用<HttpRedirectCode>
来覆盖默认值应该是获得预期行为所必需的。
<Redirect>
<HttpRedirectCode>302</HttpRedirectCode>
<HostName>example.com</HostName>
<ReplaceKeyPrefixWith>/path/to/thumbnail/generator.php?image=</ReplaceKeyPrefixWith>
</Redirect>