Избегайте кода ответа HTTP 302 при установке заголовка Location в PHP после POST - PullRequest
2 голосов
/ 30 января 2012

Мне нужно поставить код ответа 201 Created и заголовок Location для запроса POST, но по какой-то причине я все еще получаю ответ 302.

Вот что у меня есть:

header('HTTP/1.1 201');
header("Location: ..."); // The new resource URL
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;

Я безуспешно пытался удалить тип контента, echo и exit, все еще получая 302. Я читал, чтоМне нужно указать оба заголовка, но это то, что я делаю, и не повезло.Я также пытался с:

header("Location: ...", TRUE, 201);

Ничего, все еще получил 302: (

Кто-нибудь знает, что я не вижу?

Спасибо.

1 Ответ

11 голосов
/ 30 января 2012

Изменить порядок вокруг:

header("Location: ..."); // The new resource URL
header('HTTP/1.1 201 Created');
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;

Тест:

# curl -i "http://localhost/projects/scratch/302.php"
HTTP/1.1 201 Created
Date: Sun, 29 Jan 2012 23:09:02 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.5
Location: ...
Content-Length: 0
Content-Type: application/json; charset=utf-8

Другой способ

Сохраняйте первоначальный порядок, но форсируйте 201. Согласно документации PHP :

он также возвращает код состояния REDIRECT (302) в браузер, если код состояния 201 или 3xx уже был установлен.

header('HTTP/1.1 201 Created', true, 201);
header("Location: ..."); // The new resource URL
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;
...