在执行 POST 保存页面后,我返回重定向 GET 页面(即“发布/重定向/获取”模式)。
这在我测试的所有“主流”(和一些不太主流的)浏览器中都可以正常工作,除了lynx 和衍生品(链接、elinks);他们执行 POST,我返回 303,浏览器只是停留在另一个页面上(它不会在 GET 响应中加载 URL)。
我尝试使用 302 和 301,并将Cache-Control
标题设置为no-cache
; 这没有任何区别。
执行以下操作后来自我的服务器的示例响应POST /
:
HTTP/1.1 303 See Other
Server: nginx/1.6.2
Date: Sat, 10 Jan 2015 17:32:11 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 0
Location: http://localhost/
Connection: keep-alive
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
我碰巧在使用 Sinatra,所以这里有一个 Sinatra 中的示例应用程序,它演示了这个问题:
#!/usr/bin/env ruby
require 'bundler/setup'
require 'sinatra'
get '/' do
"<form method='post'>#{Time.now.to_s}<textarea name='test'></textarea><button>POST</button></form>"
end
post('/') { redirect '/' }
这是设计使然吗?还是对 HTTP 规范的解读与大多数其他浏览器不同?如何“强制”lynx 进行重定向并再次获取页面?
测试:
[~]% lynx --version
Lynx Version 2.8.8rel.1 (14 Feb 2014)
libwww-FM 2.14, SSL-MM 1.4.1, OpenSSL 1.0.1k, ncurses 5.9.20110404
[~]% links -version
Links 2.9
[~]% elinks -version
ELinks 0.13.GIT a3751107033599b835eaafa61177c8d4dda4b7ef-dirty