Ответ 1
В RFC 2616 ответ - "оригинальный метод". HTTPbis пересмотрит это, поскольку это не отражает то, что делают браузеры (к сожалению).
Смотрите http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 для истории.
Я читал этот, но у меня действительно не получилось, какой тип запроса должен иметь запрос перенаправления в каком случае, т.е. функция (начальный запрос тип, тип ответа) → тип перенаправления-запроса.
В моем конкретном случае у меня было:
Google Chrome использовал GET для перенаправленного запроса.
В библиотеке Python requests существует следующий код (здесь):
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
if r.status_code is codes.see_other:
method = 'GET'
else:
method = self.method
I.e., тип перенаправления-запроса - GET в случае 303 (codes.see_other
), во всех остальных случаях это начальный тип запроса. I.e., для моего конкретного случая выше, это будет POST, в отличие от Chrome.
Это, вероятно, неверно, потому что у меня есть один веб-сайт, где это фактически не работает корректно (т.е. веб-сайт не ведет себя так хорошо).
Каким будет правильный способ/функция?
В RFC 2616 ответ - "оригинальный метод". HTTPbis пересмотрит это, поскольку это не отражает то, что делают браузеры (к сожалению).
Смотрите http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 для истории.
Я только что искал соответствующий код в Chrome и здесь:
std::string ComputeMethodForRedirect(const std::string& method,
int http_status_code) {
// For 303 redirects, all request methods except HEAD are converted to GET,
// as per the latest httpbis draft. The draft also allows POST requests to
// be converted to GETs when following 301/302 redirects, for historical
// reasons. Most major browsers do this and so shall we. Both RFC 2616 and
// the httpbis draft say to prompt the user to confirm the generation of new
// requests, other than GET and HEAD requests, but IE omits these prompts and
// so shall we.
// See:
// https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-17#section-7.3
if ((http_status_code == 303 && method != "HEAD") ||
((http_status_code == 301 || http_status_code == 302) &&
method == "POST")) {
return "GET";
}
return method;
}
За исключением 303 и 307, любое поведение приемлемо в соответствии с spec, главным образом по историческим причинам.
Я подумал о том, что ответ на этот вопрос возник из-за Chrome и node -requests, и изначально предполагал, что это было абсолютно нормально. Тогда я подумал, что, хотя это может быть "историческое", оно, вероятно, не было "правильным". Таким образом, я нашел эту страницу, и кажется, что быть "правильным" менее важно, чем быть совместимым с "историческими" реализациями..., которые кажутся разочаровывающими на минуту. Затем я вспомнил, что каждый "традиционный", не-Ajax/API, основанный на форме "POST", который я когда-либо видел, отвечает перенаправлением, которое предполагает GET.
Это то, что есть и что, вероятно, не меняется. Спасибо всем предыдущим респондентам за предоставление всей необходимой информации.