如何在所有浏览器遵守的.htaccess中创建临时重定向?

问题描述:

这个问题的多个变种已被问到,但我似乎无法找到令人满意的答案。如何在所有浏览器遵守的.htaccess中创建临时重定向?

我以下内容添加到我的.htaccess文件

Redirect 302 /test1 /test 

然后浏览到该网站。我被重定向到/测试。
然后我删除重定向,并再次浏览到网站。在Chrome,Firefox和Internet Explorer(2017-04-14上的最新版本)中,浏览器使用缓存重定向,并将我发送到/ test。在Edge上,我得到/ test1。

正如在其他问题中提到,这是kindof确定,每the RFC

Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. 

需要注意的是“应该”在RFC行话意味着它是建议,但不是强制性的。所以建议而不是缓存重定向(因此,去/ test1),但它是确定无论如何缓存它。我不明白为什么浏览器不会在这里遵循RFC建议,但是就是这样。

于是就有了303重定向:

The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable. 

我已经测试了这一点。在给定RFC的情况下,这个重定向不可以是(如的有效)被缓存。 Edge和Firefox在这里玩的不错,不要缓存它。 Internet Explorer和Chrome似乎决定在这里直接忽略RFC,并继续发送给我/测试。

这些已知的错误是?
我误解了RFC?
是否有任何的方式,以确保我的重定向不被缓存?

是唯一使用RewriteRule的解决方案吗?浏览器无法缓存目标网址,因为他们从未看到目标网址,也不会缓存目标位置,所以这对我很有用。 (感谢@Olaf Dietsche)

RewriteRule ^test1 /test 

(在我的使用情况,我想重定向像website.com/file.pdf到另一个文件中,没有HTML页面,我可以添加一个无缓存参数,用户手动输入此网址到他们的浏览器)

+1

如果你想重写而不是重定向,请查看['RewriteRule'](https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule) –

+0

愚蠢的(我);) 。我实际上得到这个与RewriteRule一起工作。我习惯使用R标志,但是对于我的使用情况,*不使用R标志甚至更好(因为URL保持“整齐”并且不会更改为目标文件)。而且,浏览器不会缓存它;完善!所以,我的具体问题得到解决,但关于303重定向的问题仍然存在...... – Wouter

the RFC(2616)指出

该文件已被取代。

准确地说,它是RFC 7231,它明确指出“Obsoletes:2616”。而在这种情况下,相关章节是303 See Other,特别是Appendix B. Changes from RFC 2616

303(查看其他)状态代码的描述已改为 允许,如果明确的新鲜信息给它被缓存, 和为GET的303响应添加了特定的定义。 (第6.4.4节)

因此,在某些情况下,允许缓存303响应。

+0

现货答复。我是*所以*希望我已经发现了一个3主要浏览器中的错误:)(有点知道情况并非如此)所以,要完成这个答案,我会得出结论,一个*真正的*临时重定向是不可能的手段的重定向。有很多*网站在那里解释302是暂时的......看起来它们都是错误的(至少在实践中,对于大多数浏览器而言)。 – Wouter

+0

我认为302响应仍被认为是临时性的,如“[6.4.3。302 Found](https://tools.ietf.org/html/rfc7231#section-6.4.3)”所述 - 由于重定向 可能有时需要修改,客户应该继续使用 有效的请求URI作为未来的请求。“,尽管这不像* must *或* required *那样强大,当然。 –

+0

这是我看到的大问题。它被认为是暂时的,并且几乎所有的教程都会告诉你它是这样的,但似乎除Edge之外的所有浏览器都将它视为301.因此在实践中,它们不是暂时的...... – Wouter