1

在执行 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
4

1 回答 1

2

只有当我们重定向到相同的 URL 时,才会出现这个问题。因此,如果使用(相同的 URL,但使用 GET)POST /page进行重定向,则决定不做任何事情......Location: /pagelynx

我使用以下方法解决了这个问题:

<form method='post' class="markdown" action="?s=t">

s参数什么都不做,但现在我们做了POST /page?s=t并重定向到Location: /page,这已经足够不同了......

我不知道这是否是 Lynx 中的错误或功能......

于 2015-01-15T10:28:10.930 回答